我尝试下面的代码:C++ std :: add_const工作不正常?
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_const<std::add_const<int*&>::type>::value;
}
,输出为0。这是正确的行为?
我尝试下面的代码:C++ std :: add_const工作不正常?
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_const<std::add_const<int*&>::type>::value;
}
,输出为0。这是正确的行为?
参考文献不能为const
-qualified,所以std::add_const
是一个无参考类型的操作。
这是有道理的,当你认为它(和is clearly stated in standard library reference material),但乍看之下可能令人惊讶。
从std::add_const
文档:
http://en.cppreference.com/w/cpp/types/add_cv
提供构件的typedef类型,是与T相同,除了它具有 的cv-限定符加入(除非T是一个函数,一个参考,或已经 具有该CV限定符)
std::add_const
并不完全做你认为它的作用:
如果T是引用,功能,或顶层const限定型,然后键入 应名称的相同类型为T,否则ŧ常量。
(从20.10.7.1 const的挥发修改表52 N4140,重点煤矿)
正如你所看到的,std::add_const
没有为引用类型添加const
。
但是,一个常数引用首先会是什么,它们是不可改变的。 (不要与基准相混淆const
与参照非const
)
如果我们检查cpprefernece文档std::add_const我们看到它说:
提供了成员typedef的类型是相同的为T,除了它具有增加了CV-限定符(除非T是一个功能,基准,或已经具有该CV限定符)
这是与C++草案标准部20.10.7.1 CONST一致 - 易失性模块ifications它说为add_const
以下:
如果T是一个参考,函数,或顶层const限定类型,然后键入 应命名相同类型T,否则Ť常量。
是的。 C++是Python的“最小惊讶原则”的对立面。 –
你没有理会简单的阅读文档。-1 –
@KarolyHorvath鉴于在C++中不存在'const'限定的引用(而不是'const'的引用),你会期望“最不重要”的结果是什么?编译错误?虽然可能不那么令人惊讶,但它可能会少用多少。 – Angew