C++ 有没有一种方法可以使用std::array与文本或初始值设定项列表进行比较,与赋值相同?
例如:C++ 有没有一种方法可以使用std::array与文本或初始值设定项列表进行比较,与赋值相同?,c++,arrays,c++11,std,C++,Arrays,C++11,Std,例如: std::array<float, 3> vec; 为什么我们不能也做下面的比较呢 vec == {1.1, 1.2, 1.3} 相反,我们似乎不得不做 vec == std::array<float, 3>({1.1, 1.2, 1.3}) 我是否可以通过重载操作符==来完成此操作?似乎编译器应该知道将{1.1,1.2,1.3}解释为=左侧的内容。它为=执行此操作。为什么不使用=?如果没有别名,可以使用decltype转换列表 vec == decltyp
std::array<float, 3> vec;
为什么我们不能也做下面的比较呢
vec == {1.1, 1.2, 1.3}
相反,我们似乎不得不做
vec == std::array<float, 3>({1.1, 1.2, 1.3})
我是否可以通过重载
操作符==
来完成此操作?似乎编译器应该知道将{1.1,1.2,1.3}
解释为=
左侧的内容。它为=
执行此操作。为什么不使用=
?如果没有别名,可以使用decltype
转换列表
vec == decltype(vec){{1.1, 1.2, 1.3}};
可以显式调用运算符==
,但不能使用比较运算符隐式转换列表
operator==(vec, {{1.1, 1.2, 1.3}});
我能想到的唯一其他选择是std::equal_to
,但那更难看:
std::equal_to<decltype(vec)>{}(vec, {{1.1, 1.2, 1.3}});
std::等于{}(vec,{1.1,1.2,1.3});
引用标准,其中说明了初始值设定项列表可以用于什么,运算符不在该列表中。是的,但问题是“为什么我们不能同时执行以下操作…”。为什么,真的?
vec={1,2,3}
和vec={1,2,3}
之间的根本区别是什么?事实上,=
是隐式声明的,=
是用户声明的?在任何情况下,一个特殊的cmp
函数委托给std::equal(v.begin(),v.end(),il.begin(),il.end())
将是最好的,因为它避免了复制。好的,因此,链接的副本回答了我的问题:语言规范明确地对赋值运算符进行了特殊处理。下面是另一个相关问题:此处选择的答案满足了我的问题,尽管答案缺乏文件支持:文件支持似乎存在于此答案中:
vec == decltype(vec){{1.1, 1.2, 1.3}};
operator==(vec, {{1.1, 1.2, 1.3}});
std::equal_to<decltype(vec)>{}(vec, {{1.1, 1.2, 1.3}});