c++:为什么调用 foo(X&) 而不是 foo(X&&)?
c++: why does foo(X&) get called instead of foo(X&&)?
这里,creator()返回一个指向X的指针,我对其解引用并传递给foo。因为这是右值,所以应该使用move语义,对吧?但是当我运行它时,我发现foo(X&)被调用了。
#include <iostream>
using namespace std;
struct X {
int i;
};
void foo(X& x) {
cout << "foo(X&)" << endl;
}
void foo(X&& x) {
cout << "foo(X&&)" << endl;
}
struct X* creator() {
return new X {5};
}
main() {
X x{5};
foo(*creator()); // prints foo(X&)
}
creator()
返回一个指针。
对该指针解引用将得到一个左值。指针解引用的结果是左值。毕竟,如果p
是一个指针,你可以给它赋值:*p=some_value
,你只能赋值给一个左值,因此它必须是一个左值。
你被两件事弄糊涂了。函数返回一个右值,这是真的。但是你没有传递函数的返回值。该函数返回一个指针,您对该指针解引用,结果是一个左值。
从同一性和可移动性的角度考虑问题是有帮助的:
- 具有身份且无法移动?左值
- 有身份,可以从?xvalue
- 没有身份?prvalue
对指针进行解引用会产生一个具有标识的表达式,该标识不能被移动,因此它是一个左值。因此,它匹配X&
过载。
如果你想调用另一个重载,你必须注释表达式,以表明它是安全的。这就是std::move
的作用。一旦这样做,表达式就变成了一个xvalue,并且现在匹配X&&
重载。
相关文章:
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 反转C++ foo(MyClass &) vs foo(const MyClass &)
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何实现这个函数 foo.getSize().x.
- Clearing Class Foo with new(pFoo) Foo()
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 使用 G++ 编译时"Undefined Refrence to Foo"
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- foo(void) vs foo(void *)
- 没有用于调用 foo 的匹配函数
- 两种初始化有什么区别:Foo f();Foo f = Foo()
- 有没有办法删除传递给函数"foo(新对象())"的对象?
- std::size_t 还是 std::vector<Foo>::size_type?
- 引用函数如何"int &foo();"工作?
- 为什么int foo()是右值,而int&foo()在这个例子中是左值?
- <<找不到运算符,尽管定义了 Foo 类型的右操作数,但该运算符仍采用类型为 Foo 的右侧操作数
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"
- 为什么即使"a.foo<0>();"就足够了,"a.template foo<0>();"也允许?
- ld: foo.o:foo.h:6 'bar' 的多重定义 foo.h:6: 首先在这里定义