【发布时间】:2016-12-20 11:43:33
【问题描述】:
如果你看下面的代码,我认为main() 中的两行都应该为InitSomething 调用initializer_list 构造函数。 gcc 按我的预期输出22,但clang 只输出一个2。铿锵有错吗?
我正在使用-std=c++14 进行编译。
#include <iostream>
struct InitSomething {
explicit InitSomething(int) { std::cout << '1'; }
InitSomething(std::initializer_list<int> ) { std::cout << '2'; }
operator int() { return 1; }
};
int main() {
InitSomething init_something{1};
InitSomething init_something_else{init_something};
}
clang++ --version(我在 Mac 上)的输出是
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
我提到的另一个平台上g++ --version的输出是
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
【问题讨论】:
-
最近语言发生了一些变化,如果有其他构造函数直接采用
some_value,则不支持每组{some_value}的initializer_list。 -
@BoPersson 你指的是 C++17 对吗?
-
我不确定它是什么时候出现的。寻找参考...
-
好的,我认为这与Core Defect Report #1467 - List-initialization of aggregate from same-type object 有关。这具有复杂性,如果它是 C++14 中的缺陷,则可能会追溯应用更改(作为对编译器的错误修复)。
-
@BoPersson
InitSomething不是聚合。
标签: c++ gcc clang c++14 language-lawyer