无法将右值引用函数与 GCC 匹配
Cannot match rvalue reference function with GCC
尝试使用右值引用时,我从GCC收到错误(clang不会生成错误(。
为什么编译器会生成错误?这是 GCC 中的错误吗?
"简化"错误是:
|In file included from /usr/include/c++/8/sstream:38,
| from .code.tio.cpp:1:
|/usr/include/c++/8/istream: In instantiation of 'struct std::__is_extractable<std::istream&, std::istream& (*&)(std::istream&, std::string&), void>':
|/usr/include/c++/8/type_traits:131:12: required from 'struct std::__and_<std::__is_convertible_to_basic_istream<std::istringstream > >, std::__is_extractable<std::istream&, std::istream& (*&)(std::istream&, std::string&), void> >'
|/usr/include/c++/8/type_traits:136:12: required from 'struct std::__and_<std::__not_<std::is_lvalue_reference<std::istringstream > > >, std::__is_convertible_to_basic_istream<std::istringstream > >, std::__is_extractable<std::istream&, std::istream& (*&)(std::istream&, std::string&), void> >'
|/usr/include/c++/8/istream:980:5: required by substitution of 'template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&) [with _Istream = std::istringstream; _Tp = std::istream& (*&)(std::istream&, std::string&)]'
|.code.tio.cpp:12:32: required from here
|/usr/include/c++/8/istream:951:12: error: no match for 'operator>>' (operand types are 'std::istream' and 'std::istream& (*)(std::istream&, std::string&)')
| __void_t<decltype(declval<_Istream&>()
| ~~~~~~~~~~~~~~~~~~~~
| >> declval<_Tp>())>>
| ^~~~~~~~~~~~~~~~~
我正在尝试编译的代码是:
typedef std::istream &getline_type(std::istream &, std::string &);
void operator>>(std::istream &, getline_type) {} // 1
void operator>>(std::istream &&, getline_type) {}
int main()
{
std::string s;
getline_type *getline = std::getline; // 2
//using std::getline; // 3
std::istringstream("a") >> getline;
}
如果我注释掉标记为// 1
的行,它可以工作。如果我使用标记为// 3
而不是// 2
的行,它也可以工作。
我相信 clang 正确地评估了代码的格式良好,但如果有正当理由拒绝代码,则可能表明 clang 中存在错误。
在线试用!
这似乎确实是一个 GCC 错误:重载解析失败的行是特征部分专用化声明的一部分,因此替换失败应该具有消除"重载"(部分特化(的通常效果,从而为特征产生false_type
。 然后,出于同样的原因,operator>>
模板专用化本身将被消除,从而留下重载。 我假设 GCC 让你的函数渗入查找集(但只是部分,因为它毕竟因为缺乏istream&
重载而拒绝(。
- 一位朋友将模板函数缩写为clang和gcc
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- 无法将右值引用函数与 GCC 匹配
- 当 noexcept 函数尝试在 gcc 或 clang 中调用非 noexcept 函数时启用警告
- 在使用 GCC 4.8.5 构建的应用中对 cxx11 函数的未定义引用
- "朋友"成员函数和 GCC 与 Clang
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- GCC 7 中模板类的模板成员函数的专用化
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- GCC 能否优化具有相同主体的函数的代码大小?
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 如何将英特尔的数学函数库与 gcc 一起使用?
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- GCC 仪器 - 是否可以自动输出函数的参数?
- 给出一个方法作为回调函数(gcc 4.7.1)
- "is private within this context"被抛出用于不应是私有的函数(GCC 5.3.0,C++11)
- 如何在 EAX 和 ESI 中使用参数调用函数.GCC C++
- 返回模板类的模板函数 - GCC 编译问题 - 错误:令牌之前'<'预期非限定 ID