【发布时间】:2017-06-28 01:42:26
【问题描述】:
从经验上看,C++ 总是更喜欢列表初始化器而不是值初始化器。因此,我的问题是如何强制对也支持直接列表初始化的类型进行值初始化。这是一个最小的非工作示例:
#include <initializer_list>
using namespace std;
struct foo {
foo(int) {}
foo(initializer_list<char>) {}
};
struct bar {
foo f{256};
};
在此示例中,我希望使用构造函数 foo(int) 而不是 foo(initializer_list<char>) 来初始化 f。但是,GCC 和 Clang 都拒绝该代码,因为 256 对于字符来说太大了,这意味着 C++ 规范需要选择列表初始值设定项。显然注释掉foo 的第二个构造函数可以解决问题。定义bar 以便在字段f 上使用值初始化的最简单方法是什么?理想情况下,我可以避免复制初始化f,因为在我的真实示例中没有复制构造函数。
更新
澄清一下:当然可以在bar 的每个构造函数中显式初始化f。但我的问题是关于成员初始化语法的,因为在有大量构造函数的情况下,最好只在一个地方初始化某些字段,而不是全部复制代码。
【问题讨论】:
-
写一个构造函数?
-
写
foo f(256);. -
我想看看为什么
initializer_list<char>是{256}的可行构造函数。此外,根据编译器行为推断有关规范的事情也是不安全的。有时多个编译器会出错。 -
@M.M: "我想看看为什么
initializer_list<char>是{256}的可行构造函数" 因为标准总是更喜欢initializer_list在可能的情况下使用构造函数,并且 256 可以隐式转换为char。因此是可能的。但是,它是非法的,因为将 256 转换为char是一种窄化转换,这在花括号初始化列表中是不允许的。 -
@BaummitAugen:
foo f(256)不起作用,因为这是非法的成员声明语法。例如,g++ 说,“错误:数字常量之前的预期标识符”。
标签: c++ c++11 initializer-list