我可以使用c++ 11大括号初始化语法来避免为简单的聚合声明琐碎的构造函数吗?
Can I use the C++11 brace initialization syntax to avoid declaring trivial constructors for simple aggregates?
假设我有以下代码:
#include <vector>
struct Foo
{
int tag = 0;
std::function<void ()> code;
};
int main()
{
std::vector<Foo> v;
}
现在我想添加一个新的Foo
项到具有特定tag
和code
的向量中,而不需要显式地创建一个临时项。这意味着我必须为Foo
添加一个构造函数:
struct Foo
{
inline Foo(int t, std::function<void ()> c): tag(t), code(c) {}
int tag = 0;
std::function<void ()> code;
};
现在我可以使用emplace_back
:
v.emplace_back(0, [](){});
但是,当我不得不再次这样做-第100次-对一个新创建的结构体,我想:我不能使用大括号初始化式吗?像这样:
#include <vector>
struct Foo
{
int tag = 0;
std::function<void ()> code;
};
int main()
{
std::vector<Foo> v;
v.push_back(Foo{ 0, [](){} });
}
这给了我一个编译错误(不能从'initializer-list'转换为'Foo'),但我希望这可以做到,我只是语法错误。
在c++ 11中,你不能对struct
使用聚合初始化器,因为你对非静态成员tag
使用了相等初始化器。删除= 0
部分,它将工作:
#include <vector>
#include <functional>
struct Foo
{
int tag;
std::function<void ()> code;
};
int main()
{
std::vector<Foo> v;
v.push_back(Foo{ 0, [](){} });
}
根据c++ 11标准,Foo
不是聚合,大括号或相等初始化式的存在阻止了它成为聚合。
然而,这个规则在c++ 14中被改变了,所以如果你用-std=c++14
(或者任何你的编译器的等效设置)编译你的代码,Foo
将是一个聚合,你的代码将成功编译。
现场演示
对于c++ 11编译器,必须删除初始化式(这会使Foo
成为聚合),或者提供两个参数的构造函数。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 是否有任何简单的方法(黑客)揭露前向声明隐藏的标头
- 声明一个简单模板类的variadic模板类的朋友
- 简单C++程序上的多个未声明标识符
- 为什么简单析构函数在使用基指针声明时不删除派生对象
- 一个简单的猜谜游戏,继续使用除声明变量Y/N之外的任何其他字母
- 这个简单(?C++字符串声明问题似乎已经击败了StackExchange
- C++,声明一个数组与定义;发生了什么事情?(简单快捷)
- 函数未声明简单程序
- C++简单的类声明程序
- 我可以只从声明生成一个简单的构造函数吗?
- C++错误中的简单线程 - 尚未声明'Lib'
- 如何以简单的方式声明可变模板类的类型
- 为什么我的简单 c++ 代码无法编译?我收到未声明的标识符?
- 将函数声明转换为变量定义的简单技巧
- 阅读复杂const声明的简单规则
- c++0x:解决函数定义后接空声明和简单声明之间的歧义
- c++语法,简单算术函数变量结果未声明
- 我可以使用c++ 11大括号初始化语法来避免为简单的聚合声明琐碎的构造函数吗?