c++ - 转发引用、引用限定符和模板成员函数

标签 c++ templates language-lawyer member-functions forwarding-reference

采用以下成员函数:

struct T {
    template <typename X> void f(X&& x) { /* ... */ }
};

在这种情况下,x 是转发引用,因为 && 用于模板内的函数参数。这符合预期。

现在使用这个函数:

struct T {
    template <typename X> void f(X&& x) && { /* ... */ }
};

我希望 this 会以类似的方式处理;作为转发引用。因此,我希望以下程序能够正常编译和运行:

#include <iostream>

struct T {
    template <typename X>
    bool operator<(X&& rhs) && {
        std::cout << "&&" << std::endl;
        return true;
    }
};

int main() {
    T t;
    std::cout << (t < T()) << std::endl;
    return 0;
}

但是使用 GCC 4.8.4 和 6.0.1,它不会。相反,我得到以下信息:

rvalue.cpp: In function ‘int main()’:
rvalue.cpp:13:25: error: passing ‘T’ as ‘this’ argument of ‘bool T::operator<(X&&) && [with X = T]’ discards qualifiers [-fpermissive]
 std::cout << (t < T()) << std::endl;

this 似乎没有成为转发引用。 这是正确的还是错误的? this 是否应该被视为转发引用?标准的哪一部分规定了这一点?

最佳答案

这里的两个&&s`被区别对待:

struct T {
    template <typename X> void f(X&& x) && { /* ... */ }
};

您是正确的,x 是转发引用。但是右边的&&是对对象实例的限定。在这种情况下,f() 只能在对象实例是右值时调用(可能会增加混淆的是第一个 && 需要 x 作为转发引用,但第二个 && 将隐式对象参数作为右值引用)。即:

T().f(4); // ok

T t;
t.f(4); // error

这与 const 限定的工作方式相同:

struct X { void f(); };
const X cx;
cx.f(); // error

关于c++ - 转发引用、引用限定符和模板成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232109/

相关文章:

c++ - C++17 中 malloc 返回 "invalid pointer value"吗?

c++ - 使用 DXGI 将一台显示器切换到全屏时,其他显示器会变黑

c++ - 反转元组参数

c++ - 部分特化消歧优先链的更好模式?

c++ - ostream_iterator 的模板参数 - 每个元素都是对

c++ - 用模板参数填充容器

c++ - 具有虚拟析构函数的池分配器

c - 从C中的结尾访问数组?

c++ - 无法找到请求的 Boost 库 Windows Cmake

c++ - 使用条件变量进行双向通信时出现死锁