c++ - 模板函数类型推导和运算符<<

标签 c++ c++11 visual-c++ reference template-argument-deduction

当我使用 MSVC++ 编译以下代码时,出现错误:

struct A
{
    template<typename T>
    void operator<<(T&& x)
    {
    }

};
void f()
{
}
int main()
{
    A().operator<<( f );  // ok
    A() << f;             // error

    return 0;
}

g++clang 都可以很好地编译这段代码。 AFAIK, 'ok' 和 'error' 行做同样的事情,类型 T 被推导出为 void(&) ()。还是允许 void() 和对函数的右值引用?如果是这样,它们的含义是什么? 像这样通过引用传递函数可以吗?编译 'error' 行是 MSVC++ 错误吗?顺便说一句,错误输出:

no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)
could be 'void A::operator <<<void(void)>(T (__cdecl &&))'
with[ T=void (void) ]

最佳答案

为什么 void operator<<(T&& x) ? void operator<<(T& x)达到目的。

函数可以用 x() 调用内部重载函数如下

struct A
{
    template<typename T>
    void operator<<(T& x)
    {
        x();
    }

};
void f()
{
}

int main()
{
    A().operator<<( f );
    A() << f;             
    return 0;
}

关于c++ - 模板函数类型推导和运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716318/

相关文章:

c++ - 从非托管 DLL 调用 UWP api

c++ - C++11 委托(delegate)构造函数功能的实现导致了几个警告

c++11 - 单个 Lua 状态下的多个脚本并使用 _ENV

c++ - 如何在 Release模式下使用宏重新定义函数?

c++ - 不同翻译单元中字符串字面量的内存地址是否相同?

c++ - 使用 shared_ptr 的内存泄漏

c++ - 为什么不在 C++ 循环中使用 < 但 !=?

c++ - 将 C++ 11 的 for-range 语法用于顺序对的方法?

c++ - MFC 自定义 Tab 键事件处理程序

c++ - 如何在 std::stringstream 的后代中调用 "this"上的 operator<<?