当前位置:  开发笔记 > 编程语言 > 正文

此错误消息是否正确:非类型模板参数不是常量表达式

如何解决《此错误消息是否正确:非类型模板参数不是常量表达式》经验,为你挑选了1个好方法。

以下程序使用GCC 5.2编译,但不符合clang 3.6:

constexpr bool flag();

template 
constexpr 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() 
               ^

我的问题是:谁是对的?或者,换句话说:该计划是否格式错误?



1> Rumburak..:

我说铿锵是对的:

从标准:

[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.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有