为什么 std::pair 不能与 std::initiliazer_list 相提并论
Why can't std::pair be compared to std::initiliazer_list
对于 std::pair
,我只是想知道为什么会这样
std::pair<int, int> response = {1, 2}
然而,这不是:
if (response == {1, 2}) do something;
是否因为运算符 =
对于 std::pair 超载而 ==
不是?
人们已经给出了答案。我只想补充。
编辑:第二个是 不是 与 std::initializer_list
的比较,实际上是无效语法,因为像 {1,2}
这样的东西没有任何固有的type 这样(尝试 decltype({1,2}) x
。这是 list-initialization
的语言语法,它失败了,因为这不是 initialization[=51 的语句=] 本身不同于 x{1,2}
/x = {1,2}
/foo({1,2})
等。像 {1,2}
这样的东西可以用来 构造 和 initializer_list
使用 list-initialization
但它本身不是 std::initializer_list
。
std::pair
和 std::initializer_list
之间的 Comaprison 运算符不可用,这可能是有充分理由的,因为 initializr_list
is a
lightweight proxy object that provides access to an array of objects
of type const T.
请注意,initializer_list
的所有成员的类型都是同一类型 const T
。 pair
的情况并非如此 通常 具有不同的类型 T
和 U
.
如果你愿意,你可以写一个 pair
和 initializer_list
之间的相等函数,如下所示,显然遵守许多约束:
#include <iostream>
#include <type_traits>
#include <utility>
#include <initializer_list>
template <typename T, typename U>
bool foo(const std::pair<T, U>&pair,
const std::initializer_list<std::common_type_t<T, U>>& list) {
if(list.size() != 2) {
return false;
}
auto it = begin(list);
return pair.first == *it && pair.second == *std::next(it);
}
int main() {
{
std::pair<int, int> pair {1, 3};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2, 3};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, char> pair {1, 2}; //common type is int
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
// std::pair<int, long> pair {1, 2}; //common type is long int
// std::initializer_list<int> list {1, 2}; //fails template substitution
// std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
std::initializer_list<long int> list {1, 2}; //same as common type of pair
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
if(foo(pair, {1, 2})) {
std::cout<<"Matched\n";
}
}
}
这只是语法:braced-init-list 可以是操作数 only to []
and ()
(在里面)和 =
以及任何 @=
(在右边)。也允许初始化情况,其中根本没有运算符。
对于 std::pair
,我只是想知道为什么会这样
std::pair<int, int> response = {1, 2}
然而,这不是:
if (response == {1, 2}) do something;
是否因为运算符 =
对于 std::pair 超载而 ==
不是?
人们已经给出了答案。我只想补充。
编辑:第二个是 不是 与 std::initializer_list
的比较,实际上是无效语法,因为像 {1,2}
这样的东西没有任何固有的type 这样(尝试 decltype({1,2}) x
。这是 list-initialization
的语言语法,它失败了,因为这不是 initialization[=51 的语句=] 本身不同于 x{1,2}
/x = {1,2}
/foo({1,2})
等。像 {1,2}
这样的东西可以用来 构造 和 initializer_list
使用 list-initialization
但它本身不是 std::initializer_list
。
std::pair
和 std::initializer_list
之间的 Comaprison 运算符不可用,这可能是有充分理由的,因为 initializr_list
is a
lightweight proxy object that provides access to an array of objects of type const T.
请注意,initializer_list
的所有成员的类型都是同一类型 const T
。 pair
的情况并非如此 通常 具有不同的类型 T
和 U
.
如果你愿意,你可以写一个 pair
和 initializer_list
之间的相等函数,如下所示,显然遵守许多约束:
#include <iostream>
#include <type_traits>
#include <utility>
#include <initializer_list>
template <typename T, typename U>
bool foo(const std::pair<T, U>&pair,
const std::initializer_list<std::common_type_t<T, U>>& list) {
if(list.size() != 2) {
return false;
}
auto it = begin(list);
return pair.first == *it && pair.second == *std::next(it);
}
int main() {
{
std::pair<int, int> pair {1, 3};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2, 3};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, char> pair {1, 2}; //common type is int
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
// std::pair<int, long> pair {1, 2}; //common type is long int
// std::initializer_list<int> list {1, 2}; //fails template substitution
// std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
std::initializer_list<long int> list {1, 2}; //same as common type of pair
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
if(foo(pair, {1, 2})) {
std::cout<<"Matched\n";
}
}
}
这只是语法:braced-init-list 可以是操作数 only to []
and ()
(在里面)和 =
以及任何 @=
(在右边)。也允许初始化情况,其中根本没有运算符。