gpt4 book ai didi

c++11 - `auto &&i = foo();` 是什么意思

转载 作者:行者123 更新时间:2023-12-05 01:04:44 26 4
gpt4 key购买 nike

请解释自动类型推导在与移动语义一起使用时如何工作:

#include <iostream>

template <typename T>
struct A {
static void type() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};

float& bar() {
static float t = 5.5;
return t;
}

int foo() {
return 5;
}

int main() {
auto &&a1 = foo(); // I expected auto -> int (wrong)
auto &&a2 = bar(); // I expected auto -> float& (correct)

A<decltype(a1)>::type();
A<decltype(a2)>::type();
}

输出是:
static void A<T>::type() [with T = int&&]
static void A<T>::type() [with T = float&]

最佳答案

auto&& (就像 T&& 在函数模板的参数中,其中 T 是该函数模板的模板参数)遵循与其他推导略有不同的规则 - 它被非正式地称为“通用引用”。

这个想法是,如果初始化器是类型 X 的左值, auto推导为 X& .如果它是 X 类型的右值, auto推导为 X .在这两种情况下,&&然后正常应用。来自引用折叠规则,X& &&变成 X& , 而 X &&遗体 X&& .

这意味着在您的 a1案例,auto确实是推导出int ,但是 a1然后自然地声明为类型 int&& ,这就是 decltype(a1)给你。

同时,autoa2float&a2 的类型也是如此,其中 decltype(a2)再次确认。

换句话说,您的期望auto -> int在第一种情况下是正确的,但 a1 的类型是 auto &&a1 ,不仅仅是 auto a1 .

关于c++11 - `auto &&i = foo();` 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com