2015-09-19 87 views
-1

下面的代码编译在铛细++ -std = C++ 1Y,其中如在同一克给予错误++ -std = C++ 1Y外部链接模板对象eror

#include <iostream> 
using namespace std; 

class Demo { 
public: 
    Demo(){} 
}; 


template <Demo const &ref> 
void fun(){} 


Demo g; 
const Demo g_c; 

int main(){ 
    fun<g>(); 
    fun<g_c>(); 

}; 

下面克错误++

error: the value of ‘g_c’ is not usable in a constant expression 
    fun<g_c>(); 
    ^
error: ‘g_c’ is not a valid template argument for type ‘const Demo&’  because object ‘g_c’ has not external linkage 
    fun<g_c>(); 
    ^

const Demo g_c;
有内部联系权吗?这是否意味着g ++在我的分析中有bug或错误?

+0

可能重复http://stackoverflow.com/问题/ 9218615 /函数模板与参考模板参数) – BartoszKP

回答

2

const Demo g_c;
有内部联系权吗?

正确。一个(非本地)const限定对象具有内部链接,除非该声明或更早的声明明确给出了它的外部链接。

这是否意味着g ++在我的分析中有bug或错误?

您的分析肯定是错误的。 GCC的错误是告诉你,对象的引用不能用作模板参数,除非这些对象具有外部链接。你的对象没有外部链接,所以GCC的错误与它实际检查的内容相符。

但它也意味着g ++有一个错误。它执行的规则来自C++ 03。 C++ 11放宽了规则,你的代码现在是有效的。这是a known bug

您可以通过给你的对象外部链接解决它:

extern const Demo g_c; 
const Demo g_c; 

extern const Demo g_c {}; 
[功能与参考模板参数模板(的