从经验上看,C++总是比列表初始值设定项更喜欢列表初始值设定项。我的问题是如何强制一个类型的值初始化,它也支持直接列表初始化。下面是一个最小的非工作例如:C++ 11值初始值设定项vs列表初始值设定项
#include <initializer_list>
using namespace std;
struct foo {
foo(int) {}
foo(initializer_list<char>) {}
};
struct bar {
foo f{256};
};
在这个例子中,我想f
使用构造foo(int)
而非foo(initializer_list<char>)
进行初始化。然而,GCC和Clang都拒绝了代码,因为256对于char来说太大了,这意味着C++规范要求选择列表初始值设定项。明显地注释掉foo
的第二个构造函数修复了这个问题。定义bar
以便在字段f
上使用值初始化的最简单方法是什么?理想情况下,我可以避免复制初始化f
,因为在我的实例中没有复制构造函数。
更新
澄清:当然有可能在bar
每一个构造函数中明确初始化f
。但我的问题特别是关于成员初始化语法,因为在具有大量构造函数的情况下,最好只在一个地方初始化某些字段,而不是全部复制代码。
写一个构造函数? –
只要写'foo f(256);'。 –
我想看看为什么'initializer_list'是'{256}'的可行构造函数的解释。基于编译器行为推断关于规范的东西也是不安全的。有时候多个编译器会得到相同的错误。 –