c++11统一初始化不适用于clang++

c++11 Uniform initialization does not work with clang++

本文关键字:适用于 clang++ 不适用 初始化 c++11      更新时间:2023-10-16

我从这个维基百科页面复制了以下示例:

struct BasicStruct {
    int x;
    double y;
};
struct AltStruct {
    AltStruct(int x, double y) : x_{x}, y_{y} {}
private:
    int x_;
    double y_;
};
BasicStruct var1{5, 3.2};
AltStruct var2{2, 4.3};
int main (int argc, char const *argv[])
{
    return 0;
}

然后我试着用编译它

clang++ -Wall -std=c++11 test.cpp 

但我得到了这个错误:

test.cpp:17:11: error: non-aggregate type 'AltStruct' cannot be initialized with
      an initializer list
AltStruct var2{2, 4.3};
          ^   ~~~~~~~~
1 error generated.

我的叮当版本clang++ --version

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix

这个例子不应该起作用吗?也许clang还没有完全兼容c++11?

怎么回事?

提示实际上就在这里:

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
                                                                   ^~~~~~

这意味着它不是3.1版本,而是介于3.0和3.1之间。

对统一初始化的支持是在这两个版本之间实现的,所以苹果的版本可能完全不支持,或者只是部分支持。

错误:无法使用初始值设定项列表初始化非聚合类型"AltStruct"

这肯定是错误的,请参见8.5.4列表初始化[dcl.init.List]§3:

类型T的对象或引用的列表初始化定义如下:

  • 如果T是聚合,则执行聚合初始化
  • […]
  • 否则,如果T是类类型,则认为构造函数

由于AltStruct有一个采用intdouble的构造函数,因此AltStruct var2{2, 4.3};应该编译并具有与AltStruct var2(2, 4.3);相同的语义(直接初始化)。