C++11统一初始化在使用clang++编译器时无法工作

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吗?
发生了什么事情?

1
是的,这应该可以编译。它符合标准。GCC 4.7 可以编译它。也许 Clang 存在问题。 - jogojapan
1
Apple clang 3.1并不等同于LLVM Clang 3.1版本。苹果公司的版本稍旧,缺少一些后来实现的部分。 - Bo Persson
3
请注意,当前任何编译器的任何版本都没有完全实现C++11标准,这一点并不应该令你感到惊讶。令我感到惊讶的是,在C++11发布仅数天后,已经有很多人惊讶地发现它并未被完全实现。 - PlasmaHH
@PlasmaHH:我并不感到惊讶。对于许多编程语言(例如Java),当一个特性被宣传时,它就已经存在了!C和C++在这里是例外,因为特性首先需要标准化(和宣传),然后才会在大量编译器上实际实现。 - Matthieu M.
@MatthieuM:对于大多数这些语言来说,当前的实现就是规范,并且通常没有比这个实现更多的东西(如果有的话,除了领先的实现之外,其他所有实现通常都落后)。 - PlasmaHH
显示剩余3条评论
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拥有的版本可能完全没有支持或只有部分支持。

1
苹果的LLVM/clang版本出了很多问题。我建议通过MacPorts安装clang 3.1版本,这样可以避免让我抓狂。 - Stephen Chu
@StephenChu:我同意,如果他们至少从Clang/LLVM的一个版本开始而不是随意地拍摄ToT的快照,那将会简单得多:( - Matthieu M.

0
错误:非聚合类型'AltStruct'不能用初始化器列表初始化。 这绝对是错的,参见8.5.4列表初始化[dcl.init.list]§3:
列表初始化对象或类型T的引用定义如下: - 如果T是聚合体,则执行聚合初始化 - [...] - 否则,如果T是类类型,将考虑构造函数
由于'AltStruct'具有接受'int'和'double'的构造函数,因此'AltStruct var2{2, 4.3};'应该编译并具有与'direct initialization'相同的语义,例如'AltStruct var2(2, 4.3);'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接