推导类型 'auto &&' 作为函数 return 类型
Deduced type with 'auto &&' as function return type
在下面的代码片段中,函数 B::f()
是函数 A::f()
的“包装器”。但我假设 A::f()
return 类型是一种“不透明”类型,我不知道它是否具有值或引用语义。所以我不能使用 auto
或 const auto &
作为 B::f()
的 return 类型。我认为 auto &&
可以解决问题,但事实并非如此,因为 auto &&
被推断为 A::OpaqueType &
... 是否可以在这里避免写 A::OpaqueType
?
#include <iostream>
struct A {
using OpaqueType=int; // But it could have been `const int &`
OpaqueType f() const {
return i;
}
int i=42;
};
struct B {
// how could I use `auto` here to avoid writing the `A::OpaqueType`?
// I would have expected that `auto &&` would do the trick but it does not
A::OpaqueType f() const {
return a.f();
}
A a;
};
int main()
{
B b;
std::cout << b.f() << std::endl;
}
下面的代码片段让我感到困惑,因为我预计 f()
和 g()
的 return 类型会是 int
,但它是 int &
for f()
and int &&
for g()
(我什至不明白为什么不一样)...这怎么解释?
#include <iostream>
auto &&f() {
int i=42;
return i;
}
struct A {
int f() {return i;}
int i=42;
};
auto &&g() {
A a;
return a.f();
}
int main()
{
if (std::is_same_v<decltype(f()), int &>) {
std::cout << "f() return type is 'int &'\n";
}
if (std::is_same_v<decltype(g()), int &&>) {
std::cout << "g() return type is 'int &&'\n";
}
}
谢谢!
很确定您要找的是 decltype(auto)
。如果 return 语句中的表达式 returns 按值,这将 return 按值,如果 return 语句中的表达式,它将按引用 return returns 参考。那会给你
decltype(auto) f() const {
return a.f();
}
在下面的代码片段中,函数 B::f()
是函数 A::f()
的“包装器”。但我假设 A::f()
return 类型是一种“不透明”类型,我不知道它是否具有值或引用语义。所以我不能使用 auto
或 const auto &
作为 B::f()
的 return 类型。我认为 auto &&
可以解决问题,但事实并非如此,因为 auto &&
被推断为 A::OpaqueType &
... 是否可以在这里避免写 A::OpaqueType
?
#include <iostream>
struct A {
using OpaqueType=int; // But it could have been `const int &`
OpaqueType f() const {
return i;
}
int i=42;
};
struct B {
// how could I use `auto` here to avoid writing the `A::OpaqueType`?
// I would have expected that `auto &&` would do the trick but it does not
A::OpaqueType f() const {
return a.f();
}
A a;
};
int main()
{
B b;
std::cout << b.f() << std::endl;
}
下面的代码片段让我感到困惑,因为我预计 f()
和 g()
的 return 类型会是 int
,但它是 int &
for f()
and int &&
for g()
(我什至不明白为什么不一样)...这怎么解释?
#include <iostream>
auto &&f() {
int i=42;
return i;
}
struct A {
int f() {return i;}
int i=42;
};
auto &&g() {
A a;
return a.f();
}
int main()
{
if (std::is_same_v<decltype(f()), int &>) {
std::cout << "f() return type is 'int &'\n";
}
if (std::is_same_v<decltype(g()), int &&>) {
std::cout << "g() return type is 'int &&'\n";
}
}
谢谢!
很确定您要找的是 decltype(auto)
。如果 return 语句中的表达式 returns 按值,这将 return 按值,如果 return 语句中的表达式,它将按引用 return returns 参考。那会给你
decltype(auto) f() const {
return a.f();
}