|
|
1
4
GCC是错误的。 没有规则可以阻止以这种方式在常量表达式中使用函数的参数。
但是,您不能使用
价值
在这样的上下文中的参数,以及一组类型
调用的评估语义
所以,
实际上,这意味着
|
|
|
2
0
编译器在该上下文中需要一个参数,因为它需要计算完整(模板重载)函数类型。考虑到pred的实现,任何值都可以在该位置工作。这里它将F参数的模板类型绑定到参数。
g++编译器似乎在做一个简化的假设,即模板
归根结底,编译器要在函数实现的深处,将函数标记为非常量,这是由于非常量对返回值的贡献。 然后还有一个问题,就是函数是否被实例化,需要编译器实际编译代码,而不是执行模板解析,至少使用G++时,这似乎是一个不同的编译级别。
然后我使用了这个标准,它们允许编译器编写者精确地做出简化假设和模板函数实例化只适用于
因此,模板代码应该编译,但如果用非常量t实例化,则会失败。 |
|
|
3
-1
此版本正确编译:
另一个有效代码是:
这是因为你不评估
在这种情况下,clang和gcc都会编译它。
|