簡體   English   中英

我可以使用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;
}

現在我想在具有特定tagcode的向量中添加一個新的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, [](){} });
}

根據C ++ 11標准, Foo不是聚合, 支持或等於初始化器的存在阻止它成為一個。

但是, 對於C ++ 14此規則已更改 ,因此如果使用-std=c++14 (或編譯器的等效設置)編譯代碼,則Foo將成為聚合,並且您的代碼將成功編譯。

現場演示

對於C ++ 11編譯器,您必須刪除初始化程序,這將使Foo成為聚合,或者提供兩個參數構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM