以下程序使用GCC 5.2编译,但不符合clang 3.6:
constexpr bool flag(); templateconstexpr bool test() { return b; } int main() { }
我用clang得到的错误信息是:
main.cpp:3:20: error: non-type template argument is not a constant expression template^~~~~~ main.cpp:3:20: note: undefined function 'flag' cannot be used in a constant expression main.cpp:1:16: note: declared here constexpr bool flag(); ^ main.cpp:4:16: error: no return statement in constexpr function constexpr bool test() ^
我的问题是:谁是对的?或者,换句话说:该计划是否格式错误?
我说铿锵是对的:
从标准:
[temp.param] 14.1#9
9默认模板参数是在模板参数中=后指定的模板参数(14.3).[...]
并且[temp.arg.nontype] 14.3.2
1非类型模板参数的模板参数应为模板参数类型的转换常量表达式(5.20).
和[expr.const] 5.20
2条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:
[...]
(2.3) - 调用未定义的constexpr函数或未定义的constexpr构造函数;
由于flag()
已声明但未定义,因此它不是常量表达式,并且违反了14.3.2.