外部链接模板对象错误

external linkage template object eror

本文关键字:对象 错误 链接 外部      更新时间:2023-10-16

下面的代码在clang++ -std=c++1y中编译良好,而在g++ -std=c++1y

中同样给出错误
#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或错误??

const Demo g_c;
有内部联动吗??

正确的。(非局部)const限定的对象具有内部链接,除非声明或更早的声明显式地为其提供外部链接。

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

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

但这也意味着g++有一个bug。它执行的规则来自c++ 03。c++ 11放宽了该规则,您的代码现在是有效的。这是一个已知的错误。

你可以通过给你的对象外部链接来解决这个问题:

extern const Demo g_c;
const Demo g_c;

extern const Demo g_c {};