C++11 `T&&` 参数丢失其 `&&` 正确术语?

标签 c++ c++11

以下 C++11 代码无法编译:

struct T {};

void f(T&&) { }

void g(T&& t) { f(t); }

int main()
{
    g(T());
}

正确的做法是:

void g(T&& t) { f(move(t)); }

这很难用正确的自然语言术语来解释。参数 t 似乎失去了它需要用 std::move 恢复的“&&”状态。

g(T()) 中的 T() 是什么意思?

g(T&& t) 中的T&& 是什么意思?

g(T&& t) 中的 t 是什么意思?

f(t)f(move(t)) 中的 t 是什么?

move(t) 的返回值是什么?

你怎么称呼整体效果?

标准的哪些部分涉及此问题?

最佳答案

关键是参数T&& b只能绑定(bind)到一个右值,但是当后面引用表达式b时是一个左值。

所以函数的参数必须是一个右值,但在函数体内参数是一个左值,因为到那时你已经绑定(bind)了一个对它的引用并给它一个名字,它不再是一个未命名的临时值。

表达式有一个类型(例如intstring 等)并且它有一个值类别 (例如左值或右值)这两个东西是不同的。

声明为 T&& b 的命名变量具有类型“对 T 的右值引用”并且只能绑定(bind)到右值,但是当您稍后使用该引用时表达式 b 具有值类别“lvalue”,因为它有一个名称并引用某个对象(无论引用绑定(bind)到什么,即使它是一个右值。)这意味着传递 b 到另一个接受右值的函数你不能只说 f(b) 因为 b 是一个左值,所以你必须转换它(返回)到右值,通过 std::move(b)

关于C++11 `T&&` 参数丢失其 `&&` 正确术语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185142/

相关文章:

c++ - IP 地址控制 C++ ASSERT(::IsWindow(m_hWnd)) 错误

c# - 如何从 C# 调用设置 int 数组值的 C++ 函数?

c++ - 将匿名对象作为参数传递时,不会调用任何构造函数

c++ - 难以理解 C++ 依赖类型,以及当前实例化的内容

c++ - 获取基类指针的派生类

c++ - 如何编写一个模板类而不是多个模板类?

c++ - Snell 定律 — 如何处理 asin() 中的无效值?

c++ - 为什么我不能引用指向实例化对象函数的指针?

c++ - 像std::is_pointer和std::is_integral,std::is_cstring_pointer如何实现?

c++ - new struct{} 的列表初始化是否使用特定于编译器的变量?