【发布时间】:2016-05-12 04:55:10
【问题描述】:
我正在尝试在 C++11 中实现 has_equal_operator,到目前为止提出了以下解决方案。它适用于int 或struct A{} 等简单情况,但对于std::vector<A> 则失败(返回误报)。为什么会失败以及如何解决?
#include <vector>
#include <iostream>
template<typename T>
constexpr auto has_equal_operator(int) -> decltype(std::declval<T>() == std::declval<T>(), bool()) { return true; }
template<typename T>
constexpr bool has_equal_operator(...) { return false; }
struct A {};
void test()
{
std::cout << "has_equal_operator<int>: " << has_equal_operator<int>(0) << std::endl;
std::cout << "has_equal_operator<A>: " << has_equal_operator< A >(0) << std::endl;
std::cout << "has_equal_operator<std::vector<A>>: " << has_equal_operator< std::vector<A> >(0) << std::endl;
}
输出:
has_equal_operator<int>: 1
has_equal_operator<A>: 0
has_equal_operator<std::vector<A>>: 1
【问题讨论】:
-
什么意思,这是误报?
==不适用于您的两个向量吗? -
@immibis
std::vector'soperator ==只有在为元素类型定义时才应定义。 -
我认为这可能与
bool operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)不依赖于declval<_Tp>() == declval<_Tp>()的有效性有关。 -
@immibis has_equal_operator<:vector>> 返回 true,而它确实应该为 false。由于 o11c 指出 A() == A() 没有定义
-
这是EWG issue 47,它是 NAD 的,但我不太明白其中的原理。
标签: c++ c++11 typetraits