c++11统一初始化不适用于clang++
c++11 Uniform initialization does not work with clang++
我从这个维基百科页面复制了以下示例:
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
有一个采用int
和double
的构造函数,因此AltStruct var2{2, 4.3};
应该编译并具有与AltStruct var2(2, 4.3);
相同的语义(直接初始化)。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 为什么这适用于 G++ 而不是 CLANG?
- 流输入运算符导致分段错误与 clang 但适用于 gcc
- enable_if的模板专用化在 Clang 中失败,适用于 GCC
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 可变参数模板作为模板参数:演绎适用于 GCC,但不适用于 Clang
- 适用于 C++11 的 Clang++ 3.3 中的线程支持
- 无法在 Maverics 上使用 clang++ 编译有效的C++代码(适用于 llvm-g++)
- 静态表生成适用于 GCC,但不适用于 clang;被叮当窃听
- 此代码有效吗?适用于 gcc,不要与 clang 合作
- 使用enable_if选择特征-适用于clang,但不适用于gcc
- 两层嵌套的c++类适用于GCC,但不适用于Clang
- map非const函数,在clang++下编译时错误,适用于g++
- C++11 cmath 函数不在 std 命名空间中,适用于 android NDK w/gcc-4.8 或 clang