为什么gcc允许一个没有用户声明的默认构造函数的const对象,而不允许clang
Why does gcc allow a const object without a user-declared default constructor but not clang?
最近为什么const对象需要用户提供的默认构造函数?被标记为"为什么C++需要用户提供的默认构造函数来默认构造const对象?"的副本?。我使用coliru和rexter来测试各种版本的gcc(g++-4.7、g++-4.8、g++-4.9)和clang(3.4和3.5),看看这种行为是否在较新版本的编译器中引入。这里我们有两个测试用例,分别来自两个问题:
class A {
public:
void f() {}
};
int main()
{
A a; // OK
const A b; // ERROR
a.f();
return 0;
}
和:
struct B{
B():x(42){}
int doSomeStuff() const{return x;}
int x;
};
struct A{
A(){}//other than "because the standard says so", why is this line required?
B b;//not required for this example, just to illustrate
//how this situation isn't totally useless
};
int main(){
const A a;
}
叮当错误与:
error: default initialization of an object of const type 'const A' requires a user-provided default constructor
A const a;
^
预期但不是gcc,MSVC也不是。我想我可能快疯了,因为标准报价清楚地写着:
§8.5
6默认初始化T类型的对象意味着:
--如果T是(可能是cv限定的)类类型(第9条),则默认构造函数对于T被调用(并且如果T没有可访问的默认构造函数);
[…]
如果程序调用常量限定类型T,T的对象的默认初始化应为具有用户提供的默认构造函数的类类型。
11如果没有为对象指定初始值设定项,则该对象为默认初始化;[…]
第二个问题中出现的非POD语言似乎在n3337中丢失了,所以也许我丢失了一些可能已经改变的东西。这是一个错误、重复还是我遗漏了什么?
规范目前需要用户提供的默认构造函数,但GCC似乎正在实现基于DR 253的更改,该更改表示,如果所有子对象都将在没有用户提供的缺省构造函数的情况下初始化,则不需要用户提供的缺省构造函数。
此更改仅为草案状态,尚未被接受,也不属于标准的一部分。所以我认为这是GCC开发人员想要的行为,但我不确定这是否是一个一致的扩展。
以下是对第一个示例的更改,它导致GCC产生错误:
class A {
public:
void f() {}
int i;
};
int main()
{
A a; // OK
const A b; // ERROR
a.f();
return 0;
}
请注意,gcc使用-fpermission标志将错误降级为警告。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42844
- 被解释为低级别const的const对象的地址
- 使用共享指针的函数调用,其对象应为 const
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- "this"指向的对象是否与 const 对象相同?
- const auto & 和 auto & if reference 对象之间的区别是 const
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 从 const 对象访问非 const 方法
- 将非 const 对象用于 const 参数
- 如何键入用于const对象的自定义io操纵器
- 对临时对象的Const引用不会延长其生存期
- 正在通过const-ref未定义的行为捕获新构造的对象
- 具有成员变量的对象 Const 数组 = 先前索引成员变量的总和
- 为什么我构建的临时对象const不可变
- 强制用户声明对象const