为什么删除此类型别名中的 const 限定符?

Why is the const qualifier in this type alias dropped?

本文关键字:const 删除 类型 别名 为什么      更新时间:2023-10-16

TL;博士

给定以下类型:

struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
};

为什么reference == const_reference?为什么在第二个类型别名中删除const限定符?

请参阅不应该编译的 godbold 上的示例。

我有一个模板化类,它接受一堆迭代器(-类型(作为模板参数。从这些迭代器中,我需要推断出引用和常量引用类型,因为我有一些成员函数,例如:

struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
const_reference foo() const
{
return vec[0];
}
};

通过删除const限定符,我有效地返回了foo中的引用,这是非法的,因为它是一个 const 成员函数,因此编译器会抛出。

丢弃了。我们所说的"常量引用"实际上是对常量 -const int&的引用。

有一个int&并添加const将使该int& const。但是这样的常量被丢弃了。

您的问题类似于const int*int* const之间的差异。除了对于引用之外,int&int& const是同一类型 - 忽略const

你的问题是西康斯特。 西康斯特是坏康斯特东康斯特是最好的康斯特。

West const 将 const放在您想要成为 const 的令牌的左侧。 东康斯特把它放在右边。

如果我告诉你永远不要把 const 放在你的类型的左边,而这个 const 总是适用于左边的东西,看看这个:

using const_reference = reference const;

您可能可以找出为什么const不起作用。 在天真地扩展引用之后,你会得到string&const- 在这里你试图将const应用于&而不是string,并且foo &constfoo const&不同 -foo&const只是一个foo&,因为const不能应用于引用本身,而只能应用于所引用的类型。

当然,你说,但这就是为什么我想要西康斯特!

West Const在这里做同样的事情。 它适用于&,然后string然后被丢弃。 它只是以一种更令人困惑和更难直观地掌握的方式这样做。

要了解常量,请将您的常量转换为东康斯特。 West const 只是标准 east const 规则的一个例外,如果左侧类型中没有标记,则应用于右侧的标记。 此处右侧的标记是捆绑到类型别名string&整个类型(类型别名不是宏(。 相反,如果您键入const string&则右侧的令牌将string,并且您将以理智的东常量风格获得string const&

东康斯特是最好的康斯特。