以下代码编译并运行:

#include <initializer_list>
#include <iostream>
#include <vector>
#include <tuple>

void ext( std::initializer_list<std::pair<double, std::vector<double> >> myList )
{
    //Do something
}

///////////////////////////////////////////////////////////

int main(void) {
    ext( { {1.0, {2.0, 3.0, 4.0} } } );
    return 0;
}

虽然这不是:
#include <initializer_list>
#include <iostream>
#include <vector>
#include <tuple>

void ext( std::initializer_list<std::tuple<double, std::vector<double> >> myList )
{
    //Do something
}

///////////////////////////////////////////////////////////

int main(void) {
    ext( { {1.0, {2.0, 3.0, 4.0} } } );
    return 0;
}

唯一的区别是,在第一种情况下,ext()函数采用initializer_list<pair>类型的参数(有效),而另一个使用initializer_list<tuple>(无效)。但是,cplusplus.com states that



那么,为什么一个代码起作用而另一个代码不起作用?

附加信息

在第二种情况下clang++输出的错误是:
main.cpp:33:2: error: no matching function for call to 'ext'
      ext( { {1.0, {2.0, 3.0, 4.0} } } );
      ^~~
main.cpp:7:6: note: candidate function not viable: cannot convert initializer list argument to 'std::tuple<double,
      std::vector<double, std::allocator<double> > >'
void ext( std::initializer_list<std::tuple<double, std::vector<double> >> myList )
      ^
1 error generated.

而g++输出:
main.cpp: In function ‘int main()’:
main.cpp:33:35: error: converting to ‘std::tuple<double, std::vector<double, std::allocator<double> > >’ from initializer list would use explicit constructor ‘constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with _T1 = double; _T2 = std::vector<double>]’
  ext( { {1.0, {2.0, 3.0, 4.0} } } );
                                   ^

最佳答案

cplusplus.com并不是一个很好的网站,因为它充满了诸如“对是元组的特殊情况”之类的虚假陈述。您可以改用cppreference。实际上,pair不是元组的特殊情况。

现在认为tuple是更好的设计; pair较旧,并且由于向后兼容现在无法更改。

错误消息表明区别在于tuple具有explicit构造函数,而pair没有。

这意味着在构造元组时需要提及类名:

 ext( { std::tuple<double,std::vector<double>>{1.0, {2.0, 3.0, 4.0} } } );

这将在C++ 17中进行更改:且仅当元组的类型之一是具有显式构造函数的类类型时,tuple的构造函数才会显式。 gcc 6已经实现了此功能。 (信贷-乔纳森·韦克利)。参见N4387

关于c++ - 为什么 `initializer_list<pair>`和 `initializer_list<tuple>`的行为不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36476719/

10-13 02:35