我从this wikipedia page复制了以下示例:
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?
发生了什么事?
答案 0 :(得分:7)
提示实际上就在这里:
Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
^~~~~~
这意味着它不是3.1版本,而是介于3.0和3.1之间。
统一初始化的支持是在这两个版本之间实现的,因此Apple可能完全没有支持或只是部分支持的版本。
答案 1 :(得分:0)
错误:无法使用初始化列表
初始化非聚合类型“AltStruct”
这肯定是错的,参见8.5.4列表初始化[dcl.init.list]§3:
对象或类型T的引用的列表初始化定义如下:
- 如果T是聚合,则执行聚合初始化
- [...]
- 否则,如果T是类类型,则构造函数被视为
由于AltStruct
有一个构造函数采用int
和double
,AltStruct var2{2, 4.3};
应该编译并具有与AltStruct var2(2, 4.3);
相同的语义(直接初始化)。< / p>