[英]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;
}
現在我想在具有特定tag
和code
的向量中添加一個新的Foo
項,而無需顯式創建臨時項。 這意味着我必須為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, [](){} });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.