éšå«çš„默认构造æ„义?

时间:2017-01-21 21:42:32

标签: c++ c++11

对于std::tuple,this reference page表示该类型的默认构造函数是“显å¼çš„,当且仅当Tiä¸èƒ½éšå¼é»˜è®¤æž„造至少一个{{1} }}â€ã€‚

我对“éšå¼é»˜è®¤æž„造â€æ„味ç€ä»€ä¹ˆæ„Ÿåˆ°å›°æƒ‘。有人å¯ä»¥ä¸¾ä¸ªä¾‹å­å—?

2 个答案:

答案 0 :(得分:11)

以下是一个例å­ï¼š

struct A {};
struct B { explicit B() = default; };

int main()
{
    A a1 = {};
    A a2 {};

    // B b1 = {}; // Error, would use explicit default constructor
    B b2 {};
}

由于列表åˆå§‹åŒ–,使用explicit的构造函数因C ++ 11而å˜å¾—更加相关。

答案 1 :(得分:6)

è¿™æ„味ç€ï¼Œstd::tuple<T1,T2,...,Tn>éšå¼æž„建默认值,所有Ti类型都必须。

éšå¼é»˜è®¤æž„造元组的示例

例如,由于std::stringå’Œstd::vectoréšå¼é»˜è®¤æž„造(默认构造函数ä¸æ˜¯explicit),std::tuple<std::string, std::vector>是:

void f(std::tuple<std::string, std::vector<int>>);

f({}); // valid and equivalent to:
std::string sempty;
std::vector<int> vempty;
auto tsv = std::make_tuple(sempty, vempty);
f(tsv);

éžéšå¼å¯æž„造元组的示例

使用éžéšå¼é»˜è®¤å¯æž„造类型A,std::tuple<std::string, A>无法éšå¼æž„造默认值:

struct A
{
    explicit A() = default;
};

void f(std::tuple<std::string, A>);

f({}); // error