小编lee*_*eek的帖子

是否需要初始化参考变量主模板,即使它从未实例化过?

在没有初始化主要参考模板的情况下在C++ 14中声明参考模板是否合法,只要它从未实例化?

template<class T>
const T& ref;

template<>
auto ref<int> = 1;

auto x = ref<int>;
Run Code Online (Sandbox Code Playgroud)

这会在GCC和Clang上产生不同的结果:

$ g++ -std=c++14 -c ref.cpp
$

$ clang -std=c++14 -c ref.cpp
ref.cpp:2:10: error: declaration of reference variable 'ref' requires an
      initializer
const T& ref;
         ^~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

没有必要初始化主要参考模板,因为在实例化之前,它是模板,而不是参考.

我发现我可以这样做:

template<class T>
const T& ref = "Meaningless initialization with any value of any type";

template<>
auto ref<int> = 1;

auto x = ref<int>;
Run Code Online (Sandbox Code Playgroud)

因为显然GCC和Clang都接受但忽略了参考模板初始化器RHS,只要它是一个有效的表达式并且主参考模板永远不会被实例化.任何类型的任何表达式都满足Clang的初始化要求.

只要主参考模板从未实例化,GCC就不需要初始化程序.这似乎是"在精神上"的正确行为,因为在实际实例化参考模板之前,它不应该需要初始化器.

标准在参考模板上不是100%明确.这是我在变量模板实例化上找不到的东西:

14.7.1

除非已显式实例化或显式专门化变量模板特化,否则在使用特化时隐式实例化变量模板特化.

...

实现不应隐式实例化......不需要实例化的变量模板.

14.7.2

除了内联函数,从其初始值或返回值(7.1.6.4)推导出的类型的声明const …

c++ templates language-lawyer clang++ variable-templates

12
推荐指数
1
解决办法
214
查看次数