Sha*_*our 42 c++ language-lawyer c++14 new-expression
在C++ 14中给出以下代码:
void foo() {
double d = 5.0;
auto p1 = new int[d];
}
Run Code Online (Sandbox Code Playgroud)
clang在没有诊断的情况下编译它,而另一方面gcc产生以下诊断(见它在godbolt中生活):
error: expression in new-declarator must have integral or enumeration type
7 | auto p1 = new int[d];
| ^
Run Code Online (Sandbox Code Playgroud)
我特意标记了这个C++ 14,因为在C++ 11模式下,clang将其视为格式不正确并产生以下诊断(请参阅godbolt中的内容):
error: array size expression must have integral or unscoped enumeration type, not 'double'
auto p1 = new int[d];
^ ~
Run Code Online (Sandbox Code Playgroud)
clang是否正确?如果是这样,在C++ 14中有什么改变允许这个?
Sha*_*our 44
Clang是正确的,[expr.new] p6中的关键措辞与C++ 11草案中的以下内容有所不同:
noptr-new-declarator中的每个常量表达式都应该是一个整型常量表达式([expr.const])并计算为严格正值.noptr-new-declarator中的表达式应该是整数类型,unscoped枚举类型,或者存在单个非显式转换函数为整数或未整数枚举类型的类类型([class.conv]).如果表达式是类类型,则通过调用该转换函数来转换表达式,并使用转换结果代替原始表达式....
noptr-new-declarator中的每个常量表达式都应该是类型的转换常量表达式([expr.const]),并且应该计算为严格正值.noptr-new-declarator中的表达式被隐式转换为....
std::size_tstd::size_t
在C++ 14中,对noptr-new-declarator中表达式的要求被削弱为不需要整数,无范围枚举或具有单个非显式转换函数的类到这些类型之一,但只允许隐式转换为size_t.
措辞的变化来自提案A关于调整某些C++语境转换的提案,v3.
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |