2015-11-02 84 views
1

我尝试下面的代码:C++ std :: add_const工作不正常?

#include <iostream> 
#include <type_traits> 
int main() { 
    std::cout << std::is_const<std::add_const<int*&>::type>::value; 
} 

,输出为0。这是正确的行为?

+2

是的。 C++是Python的“最小惊讶原则”的对立面。 –

+3

你没有理会简单的阅读文档。-1 –

+2

@KarolyHorvath鉴于在C++中不存在'const'限定的引用(而不是'const'的引用),你会期望“最不重要”的结果是什么?编译错误?虽然可能不那么令人惊讶,但它可能会少用多少。 – Angew

回答

0

std::add_const文档:

http://en.cppreference.com/w/cpp/types/add_cv

提供构件的typedef类型,是与T相同,除了它具有 的cv-限定符加入(除非T是一个函数,一个参考,或已经 具有该CV限定符)

1

std::add_const并不完全做你认为它的作用:

如果T是引用,功能,或顶层const限定型,然后键入 应名称的相同类型为T,否则ŧ常量。

(从20.10.7.1 const的挥发修改表52 N4140,重点煤矿)

正如你所看到的,std::add_const没有为引用类型添加const

但是,一个常数引用首先会是什么,它们是不可改变的。 (不要与基准相混淆const与参照非const

0

如果我们检查cpprefernece文档std::add_const我们看到它说:

提供了成员typedef的类型是相同的为T,除了它具有增加了CV-限定符(除非T是一个功能,基准,或已经具有该CV限定符

这是与C++草案标准部20.10.7.1 CONST一致 - 易失性模块ifications它说为add_const以下:

如果T是一个参考,函数,或顶层const限定类型,然后键入 应命名相同类型T,否则Ť常量。