gpt4 book ai didi

c++ - 为什么 `initializer_list` 和 `initializer_list` 的行为不同?

转载 作者:IT老高 更新时间:2023-10-28 22:38:23 27 4
gpt4 key购买 nike

以下代码编译并运行:

#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

Pairs are a particular case of tuple.

那么为什么一个代码有效而另一个无效?


其他信息

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com