将decltype与使用非ADL查找的运算符一起使用

时间:2017-11-17 18:24:33

标签: c++ c++11 gcc

我有以下(人为的)代码:

#include <utility>

namespace N
{
  struct A {};
  struct B {};
}

namespace operators
{
  bool operator|(N::A, N::B) { return true; };
}

namespace details
{
  using namespace operators;

  template<typename T, typename U>
  using UnionResultType = decltype(std::declval<T>() | std::declval<U>());
}

int main()
{
  {
    using namespace operators;
    using UnionAB = decltype(std::declval<N::A>() | std::declval<N::B>());
    static_assert(std::is_same<UnionAB, bool>::value);
  }

  {
    using UnionAB = details::UnionResultType<N::A, N::B>;
  }

  return 0;
}

GCC在第二个块中编译UnionAB声明时遇到问题:

operators.cpp: In substitution of ‘template<class T, class U> using UnionResultType = decltype
((declval<T>() | declval<U>())) [with T = N::A; U = N::B]’:
operators.cpp:31:56:   required from here
operators.cpp:19:54: error: no match for ‘operator|’ (operand types are ‘N::A’ and ‘N::B’)
using UnionResultType = decltype(std::declval<T>() | std::declval<U>());

即使定义了模板using namespace operators的范围内有UnionResultType,GCC也无法找到运算符重载。

我正在使用GCC 7.2.0(C ++ 11,14和17模式都有相同的问题)。

代码中是否存在某些问题,或者这是编译器问题?如果这是编译器问题,这是一个已知问题吗?

0 个答案:

没有答案