指向不完整类型的数据成员
Pointer to data member of incomplete type
以下代码在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();
}
我要问的原因是因为它使用gcc和clang(x86/x86_64)的较新版本起作用(或似乎是),但是Visual Studio 2015更新2和更新3 RC。P>
在报告错误之前,我想确保我不依赖不确定的行为或不搜索正确的条款。
我还尝试了本文中提到的/vmg
和/vmb
。
(*):我主要关心C 14及以后,但我认为答案不应适用于C 11。
(**):如果代码定义良好,则看起来像是一个代码错误,它不是指针分配室。将struct S
更改为struct S{}
似乎使代码"工作"。
您的代码定义很好:
N4594 3.2/5
[...] 类型T类必须完成,如果:
- (5.1) 定义了T型的对象(3.1)或
- (5.2) 声明T型的非静态类数据成员(9.2)或
- (5.3) t用作新表达(5.3.4)或
中的对象类型或数组元素类型- (5.4) 将LVALUE转换到glvalue,指的是T型(4.1)或
的对象- (5.5) 表达式被转换为T型T型(第4、5.2.3、5.2.7、5.2.9、5.4)或
- (5.6) 不是零指针常数的表达式,并且具有CV void*以外的其他类型,被转换为 使用标准转换(第4条),dynamic_cast(5.2.7)或一个 static_cast(5.2.9)或
- (5.7) 类成员访问操作员被应用于T型(5.2.5)或
的表达式- (5.8) TypeID操作员(5.2.8)或尺寸运算符(5.3.3)应用于T型操作数或
- (5.9) 定义具有返回类型或参数类型的函数(3.1)或称为(5.2.2)或
- (5.10) 定义了具有T型基类的类(第10条)或
- (5.11) T型的LVALUE分配给(5.18)或
- (5.12) T型是对准表达式(5.3.6)或
的主题- (5.13) 异常 - 陈述具有T型,引用t或指向T(15.3)。
他们都没有说T
需要完成才能声明T
的指针到会员。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 是否可以根据其数据成员的类型确定类型的大小
- 拒绝包含某些公共静态数据成员的类型
- 复制构造抽象类型的数据成员
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 具有引用数据成员的结构不是文本类型吗?
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 标记为 [数据成员] 时的意外类型'USN'
- 依赖于依赖类型的非静态数据成员的非限定名称
- 基类数据成员类型取决于派生类
- 类型为专用数据成员的静态成员
- QString:包括非文本类型的静态数据成员的初始化
- 由于标准而指向 Base 数据成员的指针类型
- sizeof参考对于类型和数据成员的不同
- 对齐说明符:在类型 / 上 成员数据
- 参考类型静态数据成员的问题可能是编译器错误
- 指向不完整类型的数据成员
- C++静态匿名类类型数据成员