自定义对象的常量表达式

nil*_*ils 1 c++ templates constant-expression

我正在尝试使用自定义类的瞬间作为模板参数.

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

template <class Foo, Foo foo>
struct Bar {

};
const X x;
Bar<X, x> foo;
Run Code Online (Sandbox Code Playgroud)

编译器声明x不能出现在常量表达式中.为什么?在编译时构造该对象有一切.

Tad*_*pec 7

你不能这样做.标准14.1说:

4非类型模板参数应具有以下之一(可选cv限定)类型:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 对象的引用或对函数的引用,
- 指向成员的指针.
5 [注意:管理模板参数形式的规则 (14.3)明确地禁止或隐式地禁止其他类型.-end note]确定模板参数的类型时,将忽略template-parameter上的顶级cv限定符.