【问题标题】:Initializing a dynamic array of non-default constructible objects初始化非默认可构造对象的动态数组
【发布时间】:2016-05-20 00:58:08
【问题描述】:

以下代码:

struct Foo
{
    Foo(int){} // no default constructor
};

int main()
{
    Foo* pFoo = new Foo[2]{1,2}; // OK in g++, fails in clang++!
    delete[] pFoo;
}   

compiles in gcc,但fails in clang。上面的代码语法正确吗?

【问题讨论】:

  • 就在我认为我们可以信任我们的工具的时候。我想你弄坏了其中一个。看,这就是为什么我们不能有好的编译器。
  • 代码在语法上是正确的:new Foo[2] 后面可以跟一个大括号括起来的列表。我猜你实际上是在问它是否格式正确
  • 对我来说看起来像clang bug。来自 clang 3.8 的错误消息是无稽之谈,例如“注意:在数组元素 2 的隐式初始化中,省略了初始化程序”
  • 如果你确实提供了一个默认构造函数,clang 不会调用它
  • 参见llvm.org/bugs/show_bug.cgi?id=22924 以及其中的讨论;还有wg21.link/cwg2102.

标签: c++ arrays c++11 language-lawyer


【解决方案1】:

我会转@T.C.对答案发表评论,这样每个人都可以看到发生了什么,而无需阅读所有 cmets。

这是一个clang bug,代码应该被接受:http://llvm.org/bugs/show_bug.cgi?id=22924

相关:http://wg21.link/cwg2102

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2015-12-26
    • 2011-05-15
    • 2012-01-02
    相关资源
    最近更新 更多