我试图了解使用auto作为参考的细节。但是,在执行了下面的基本代码后,我有点困惑。
int x = 99; const int& xr = x; auto& xr2 = xr ;xr2 = 88;
int x = 99;
const int& xr = x;
auto& xr2 = xr ;
xr2 = 88;
我读到C++中的auto关键字可以消除const和reference限定符,所以我希望xr2的类型是int&。但是,我收到了一条错误消息,上面写着“错误:只读引用xr2的赋值。”您能解释一下为什么吗?最好的问候。
fslejnso1#
auto xr2 = xr;总是非常量非引用,是的。但是,当您添加&时,它不再破坏稳定性,并且始终是一个(左值)引用。
auto xr2 = xr;
&
w3nuxt5m2#
auto的规则相当简单,因为它们反映了函数模板参数推导的规则:如果 * 占位符类型说明符 * 的形式为 * type-constraint * opt auto,则替换T的推导类型T'将使用模板参数推导规则来确定。[...]
auto
T
T'
const auto &i = expr;
i的类型是以下发明的函数模板的调用f(expr)中参数u的推导类型:
i
f(expr)
u
template <class U> void f(const U& u);
auto关键字并不总是允许删除cv限定符(const,volatile);仅当将变量声明为非引用时。例如:
const
volatile
const volatile int& x = ...;// y is of type int, with no cv-qualifiersauto y = x;
const volatile int& x = ...;
// y is of type int, with no cv-qualifiers
auto y = x;
这是因为cv限定符在传递给非引用函数参数时被丢弃(这称为 * decay *)。auto变量遵循函数模板参数推导的规则,所以这里也会发生同样的事情。
在您的示例中,所有auto的使用仍然涉及&,因此不会发生衰减,并且保留了cv限定符。您的代码无法编译,因为发生了以下情况:
int x = 99;const int& xr = x;// auto deduces to const int// xr2 is declared as const int&, just like xrauto& xr2 = xr ;// error: assigning 88 to const variablexr2 = 88;
// auto deduces to const int
// xr2 is declared as const int&, just like xr
// error: assigning 88 to const variable
2条答案
按热度按时间fslejnso1#
auto xr2 = xr;
总是非常量非引用,是的。但是,当您添加
&
时,它不再破坏稳定性,并且始终是一个(左值)引用。w3nuxt5m2#
auto
的规则相当简单,因为它们反映了函数模板参数推导的规则:如果 * 占位符类型说明符 * 的形式为 * type-constraint * opt
auto
,则替换T
的推导类型T'
将使用模板参数推导规则来确定。[...]
i
的类型是以下发明的函数模板的调用f(expr)
中参数u
的推导类型:* 衰减 *-
auto
删除cv限定符时auto
关键字并不总是允许删除cv限定符(const
,volatile
);仅当将变量声明为非引用时。例如:这是因为cv限定符在传递给非引用函数参数时被丢弃(这称为 * decay *)。
auto
变量遵循函数模板参数推导的规则,所以这里也会发生同样的事情。为什么你的示例不编译
在您的示例中,所有
auto
的使用仍然涉及&
,因此不会发生衰减,并且保留了cv限定符。您的代码无法编译,因为发生了以下情况: