簡體   English   中英

c ++ 11努力理解為什么我不能統一初始化結構,但是可以初始化類似類型的std :: pair

[英]c++11 struggling to understand why I can't uniform init a structure, but I can init a std::pair of similar type

給出以下代碼:

#include <functional>
#include <string>
#include <iostream>

class test
{
public:
    struct info
    {
        std::string name {""};
        std::function<bool()> func;
    };

    //info my_info { "test_name", [&]{return member_func();} }; // <------ ERROR HERE

    std::pair<std::string, std::function<bool()>> my_info_pair { "test_name", [&]{return member_func();} };

    bool member_func()
    {
        std::cout << "member_func\n";
        return true;
    };

};

int main() {
    std::cout << "start\n";
    test t;
    std::cout << t.my_info_pair.first << std::endl;
    t.my_info_pair.second();
    std::cout << "end\n";
}

此代碼有效。 但是,如果我取消注釋行的注釋-它試圖以與std :: pair初始化相同的方式初始化info結構,則它將失敗。 我不知道為什么...

錯誤得到的是:

prog.cc:15:60: error: could not convert '{"test_name", <lambda closure
object>test::<lambda()>{((test*)this)}}' from '<brace-enclosed
initializer list>' to 'test::info'
     info my_info { "test_name", [&]{return member_func();} };
                                                             ^

鏈接到我的測試代碼: 此處(wandbox)

這里的問題是

std::string name {""};

您要使用in類成員初始化程序,而在C ++ 11中,如果希望對象是一個聚合(根據[dcl.init.aggr] / 1 ),則不允許這樣做。 要使其在C ++ 11中編譯,必須將其刪除。

在C ++ 14及更高版本中,該約束已刪除(更新了[dcl.init.aggr] / 1 ),並且在類成員初始化器中允許使用聚合,並且代碼將按原樣編譯。

暫無
暫無

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

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