4

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

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版本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?

这是怎么回事?

4

2 回答 2

7

提示实际上在这里:

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

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

对统一初始化的支持是在这两个版本之间的某个地方实现的,因此 Apple 的版本可能完全不支持或仅部分支持。

于 2012-07-12T12:02:33.760 回答
0

错误:非聚合类型“AltStruct”不能用初始化列表初始化

这绝对是错误的,请参阅 8.5.4 列表初始化 [dcl.init.list] §3:

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

  • 如果 T 是聚合,则执行聚合初始化
  • [...]
  • 否则,如果 T 是类类型,则考虑构造函数

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

于 2012-07-12T10:12:41.817 回答