为什么删除此类型别名中的 const 限定符?
Why is the const qualifier in this type alias dropped?
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 &const
与foo const&
不同 -foo&const
只是一个foo&
,因为const
不能应用于引用本身,而只能应用于所引用的类型。
当然,你说,但这就是为什么我想要西康斯特!
West Const在这里做同样的事情。 它适用于&
,然后string
然后被丢弃。 它只是以一种更令人困惑和更难直观地掌握的方式这样做。
要了解常量,请将您的常量转换为东康斯特。 West const 只是标准 east const 规则的一个例外,如果左侧类型中没有标记,则应用于右侧的标记。 此处右侧的标记是捆绑到类型别名string&
整个类型(类型别名不是宏(。 相反,如果您键入const string&
则右侧的令牌将string
,并且您将以理智的东常量风格获得string const&
。
东康斯特是最好的康斯特。
- 删除C++中带有 vector<const char *> 的类
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- std::d ecay 并删除 const 限定符
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 为什么删除此类型别名中的 const 限定符?
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- 为什么删除运算符在const上下文中使用
- 通过参考const成员通过参考时,尝试引用已删除的函数
- 为什么删除字符串迭代器会产生const char参考
- 如何从const char *类型字符串中删除新线字符
- 使用已删除的功能'std::thread::thread(const std::thread&)'
- 删除标头中用作函数参数的"primitive"类型前面的"const"是否更好?
- 如何从'char const*'中删除常量
- 通过 const_cast 删除 const 并调用不修改结果对象的非 const 函数是否安全?
- 错误 C2280:'std::thread::thread(const std::thread &)':尝试引用已删除的函数
- 如何修复错误'std::promise<int>::promise(const std::promise<int> &)':尝试引用已删除的函数
- 如果我删除 const,为什么这个带有 boost::shared_ptr 的调用不能在 c++ 中编译
- 如何删除抽象类中类似的 const 和非 const 成员函数之间的代码重复
- 为什么'std::p air<int, movable>'需要一个[已删除的]'const&'复制构造函数?