我有一个模板类C,它具有类型的非类型但引用模板参数P:
class P {
public:
int x;
int y;
};
template <const P &x>
class C {
public:
const int &f() { return x.x; }
};
Run Code Online (Sandbox Code Playgroud)
我声明了一个类型的全局变量P:
P p = {33,44};
Run Code Online (Sandbox Code Playgroud)
我还声明了一个返回引用的函数p:
constexpr const P &h() { return p; }
Run Code Online (Sandbox Code Playgroud)
然后尝试在下面使用这些:
C<p> o; // line 1
C<h()> oo; // line 2
Run Code Online (Sandbox Code Playgroud)
当然我对第一次实例化没有问题,但第二次实例化没有问题.我的编译器抱怨:
error: non-type template argument does not refer to any declaration
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我无法在常规中找到反对它的论据.我不确定它是否与在默认模板参数中调用constexpr完全相同的问题,其中讨论是关于嵌套 instanciation的实例化点.这是一个类型问题,但哪一个?我的函数h()返回对定义良好的类型(const …