【问题标题】:Why is gcc and msvc allow const objects without user-provided constructor? Is this a bug?为什么 gcc 和 msvc 允许没有用户提供的构造函数的 const 对象?这是一个错误吗?
【发布时间】:2016-03-31 11:20:22
【问题描述】:

这段代码:

class A {
public:
    A() = default;
};

int main()
{
   const A a;

   return 0;
}

可以在 Visual C++(来自 VS 2015 Update 2)和 GCC(5.3.1)中编译而没有错误,但不能使用 Clang 编译,它给出了这个错误:

test.cpp:8:13: error: default initialization of an object of const type
      'const A' without a user-provided default constructor
           const A a;
                   ^
                    {}
1 error generated.

谁是对的,clang 还是 gcc 和 MSVC? 其他编译器的行为是错误吗?

附言。 const A a{}; 编译时所有三个都没有错误。 如果我们定义空构造函数也是一样的:A::A() {}

PPS。这不是重复的。我强调实际问题。

更新在 MSVC 中提交了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/2538005 S.T.L.表示他们正在修复它们以符合 clang 测试:https://twitter.com/StephanTLavavej/status/715923311796953089

【问题讨论】:

  • 为什么要将默认构造函数定义为默认值?如果你默认不要声明它,或者声明它并定义它。
  • @AsierSánchezRodríguez 因为我可以。这不是关于的问题。
  • this one 怎么样?

标签: c++ gcc visual-c++ clang language-lawyer


【解决方案1】:

gcc 符合DR253Why does gcc allow a const object without a user-declared default constructor but not clang? 请注意,gcc 不需要存在显式默认的默认构造函数:

struct A {};  // No uninitialized members
int main() {
   const A a; // OK with gcc
}

MSVC 是不一致的,因为它允许在 A 具有未初始化的数据成员时编译代码,无论是否存在显式默认的默认构造函数,但它至少会发出诊断 (C4269)所以应该很容易做到一致:

struct A { int i; }; // Uninitialized data member
int main() {
   const A a;  // Should be ill-formed; MSVC accepts with diagnostic
}

main.cpp(8): 警告 C4269: 'a': 'const' 使用编译器生成的默认构造函数初始化的自动数据会产生不可靠的结果

clang 有一个 patch accepted and ready to land(自 2015 年 6 月起),但它似乎已被遗忘。

【讨论】:

  • DR253 制定标准了吗?上次我检查(2015 年 10 月)没有任何活动,它仍处于“正在起草”状态。
猜你喜欢
  • 2014-11-22
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多