为什么允许一些非常量表达式作为constexpr逗号运算符的操作数



考虑一个简单的例子:

int foo() {
return 3;
}
template <int>
struct Bar {};
int a;
int main() {
int b;
//Bar<((void)foo(), 1)> bar1;  //case 1. compilation error as expected
Bar<((void)a, 2)> bar2;        //case 2. no error (long shot but `a' has a linkage so maybe expected)
Bar<((void)b, 3)> bar3;        //case 3. no error ? (`b' does not have linkage) 
(void)bar2;
(void)bar3;
}

我想说这是一个错误,但最新的[crang]和[gcc]都接受代码,所以也许我缺少了一些使代码有效的相关标准规则?

左值到右值的转换不会应用于逗号运算符的第一个参数,除非它是可变的。因此,(void)a, 2(void)b, 3是常数表达式。

参见[expr.comma]/1

。。。左边的表达式是一个丢弃的值表达式。。。

和[expr]/12

。。。当且仅当表达式是volatile限定的glvalue类型,并且它是以下之一:。。。

相关内容

  • 没有找到相关文章

最新更新