为什么在某些情况下从函数返回类型中删除 cv 限定符?
Why do cv-qualifiers get removed from function return type in some cases?
看看这个简单的例子:
template <typename T>
const T const_create() {
return T();
}
struct Foo { };
int main() {
auto &x = const_create<Foo>(); // compiles
// auto &x = const_create<int>(); // doesn't compile
}
为什么带有Foo
的版本可以编译,而带有int
的版本不能编译?换句话说,为什么const
从const_create<int>
的返回类型中删除?它的工作原理就像它返回int
,而不是const int
。这不是语言上的不一致吗?
标准在哪里强制要求这种行为?
[expr]/6 说:
如果 prvalue 最初具有 ">cv
T
"类型,其中T
是 CV-不合格非类、非数组类型、类型在进行任何进一步分析之前,将表达调整为T
。
因此,const Foo
prvalue 只是const Foo
,但const int
prvalue 被调整为int
。
CWG 1261 在 C++14 中引入了此规则(将 N3337 [basic.lval]/4 与 N4140 [expr]/6 进行比较(。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- 模板引用折叠正在删除常量引用返回类型的cv限定符
- 如果cv::Mat是用用户分配的数据构建的,那么它会负责删除它吗
- 在使用declytype推断类型时删除CV限定符