C++构造函数采用大小为1的std::initializer_list
C++ constructor taking an std::initializer_list of size one
下面的示例程序代码背后的想法是为了说明这样一个事实,即当只给定一个元素时,拥有一个不等价于默认副本构造函数的初始值设定项列表构造函数可能会导致Clang意外的结果。
它还表明,Clang和GCC在复制构造函数和初始化器列表构造函数之间没有实现相同的优先级,这在实践中使得这种类型的初始化器列表构造器不可能用于可移植代码。
// Include directive.
#include <initializer_list>
// The struct used in this case.
struct Foo
{
// Member value.
int val;
// Default constructor.
Foo() : val(0) {}
// Initializer list constructor.
Foo(std::initializer_list<Foo>) : val(2) {}
};
// Main function.
int main()
{
// Default constructed Foo object.
Foo foo_zero;
// It is not clear to me which constructor
// should be called by the following statement.
Foo foo_test = { foo_zero };
// Return exit code.
// Clang 6.0.0 returns 0 (i.e. implicit copy constructor was called for 'foo_test').
// GCC 8.2 returns 2 (i.e. initializer list constructor was called for 'foo_test').
return foo_test.val;
}
我的问题如下:
我的示例程序的返回值应该是多少(Clang和GCC似乎不一致(?
有没有一种方法可以用Clang和GCC使用的语法来调用我的示例程序的初始值设定项列表构造函数?
Clang实现了DR 1467(大括号从T
初始化T
的行为就像您没有使用大括号一样(,但尚未实现DR 2137(仔细想想,只对聚合执行此操作(。
您的代码应该返回2。
一种可能的解决方法是Foo foo_test({ foo_zero });
。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- std::move in initializer lists
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?
- 在GCC中使用Brace Initializer初始化成员STD ::数组时错误
- VS2015无法从'initializer list'转换为'std::string'错误
- 如何使用 std::array 的默认参数? "array must be initialized with a brace-enclosed initializer"
- 为什么我会收到"variable 'std::packaged_task<int> task' has initializer but incomplete type"错误
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 如何解决"Variable 'std::ifstream myfile' has initializer but incomplete type"
- 将Initializer Lists与std::map一起使用
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'