use*_*653 7 c++ visual-c++ c++11
以下代码是否在C++中定义良好?(*)
我很难弄清楚在标准中的哪个位置,并且搜索网络并没有发现具体的东西.
struct S;
struct T {
constexpr T() = default;
bool S::* a = nullptr;
int b = 42;
};
const T t{};
// Test. Compiled using: cl /W4 /WX /FAs filename.cpp
#include <stdlib.h>
int main() {
if (t.b != 42) abort();
}
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为它适用于(或似乎)较新版本的GCC和Clang(x86/x86_64),但在Visual Studio 2015 Update 2和Update 3 RC中失败(**).
在报告错误之前,我想确定我不是依赖于未定义的行为,或者只是没有搜索正确的术语.
(*):我主要关心C++ 14及更高版本,但我认为答案不适用于C++ 11.
(**):如果代码定义明确,它看起来像一个codegen bug,它不是指针的分配空间.更改struct S到struct S{}似乎使代码的"工作".
您的代码定义明确:
N4594 3.2/5
[...] 如果符合以下条件,则类T必须完整:
- (5.1)定义类型为T的对象(3.1),或
- (5.2)声明类型为T的非静态类数据成员(9.2),或
- (5.3)T用作new-expression(5.3.4)中的对象类型或数组元素类型,或
- (5.4)对参考类型为T(4.1)的对象的glvalue应用左值到右值的转换,或者
- (5.5)将表达式(隐式或显式)转换为T类(第4,5.2.3,5.2.7,5.2.9,5.4条),或者
- (5.6)表达式不是空指针常量,并且具有cv void*以外的类型,使用标准转换(第4节)转换为T的类型指针或引用T(动态广播(5.2.7))或者static_cast(5.2.9),或者
- (5.7)类成员访问运算符应用于类型为T(5.2.5)的表达式,或
- (5.8)将typeid运算符(5.2.8)或sizeof运算符(5.3.3)应用于类型T的操作数,或者
- (5.9)具有类型T的返回类型或参数类型的函数定义为(3.1)或调用(5.2.2),或
- (5.10)定义了类型为T的基类(第10条),或
- (5.11)将类型T的左值分配给(5.18),或
- (5.12)类型T是对齐表达式(5.3.6)的主语,或
- (5.13)异常声明具有类型T,对T的引用或对T的指针(15.3).
他们都没有说T要完成以便声明指向成员的指针T.
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |