从下面的程序的输出都将1A其A经历时c++filt -t.我可以看到返回类型在返回时被推导为值类型而不是rvalue引用类型std::move.对于大多数返回的用例来说,这是有意义的std::move,但这是什么原因?std::move返回一个右值引用,但为什么返回类型会自动推导为值类型?
#include <iostream>
#include <memory>
#include <utility>
#include <typeinfo>
struct A
: std::unique_ptr<int>
{
auto f()
{
return A();
}
auto g()
{
return std::move(A());
}
};
int main()
{
std::cout << typeid(decltype(A().f())).name() << ' ';
std::cout << typeid(decltype(A().g())).name() << ' ';
std::cout << typeid(A).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
您有两个不同的问题:
typeid剥离参考,然后顶级cv资格; typeid(int),typeid(const int)并且typeid(const int&&)是同一个东西.要测试实际类型,请使用std::is_same; Boost.TypeIndex有type_id_with_cvr.您还可以template<class T> class TD;尝试定义类型变量TD</*type to be checked*/>,并从编译器生成的错误消息中读出类型.但这在这里是无害的; 两者f()并且g()确实A按价值返回:
auto f() { return /* stuff */; }使用auto规则,从不推断引用类型.这实际上通常是你想要的 - 你真的不想意外地返回对已经死亡的东西的引用 - 这确实是你g()返回引用时会做的事情!要获得"完美回归",请使用decltype(auto).
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |