Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std::add_const工作不正常?_C++_Typetraits - Fatal编程技术网

C++ C++;std::add_const工作不正常?

C++ C++;std::add_const工作不正常?,c++,typetraits,C++,Typetraits,我尝试了以下代码: #include <iostream> #include <type_traits> int main() { std::cout << std::is_const<std::add_const<int*&>::type>::value; } #包括 #包括 int main(){ std::cout来自std::add_const文档: 提供与T相同的成员typedef类型,只是 添加了cv限

我尝试了以下代码:

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

std::cout来自
std::add_const
文档:

提供与T相同的成员typedef类型,只是 添加了cv限定符(除非T是一个函数,是一个引用,或者已经是 有此cv限定符)


std::add_const
文档:

提供与T相同的成员typedef类型,只是 添加了cv限定符(除非T是一个函数,是一个引用,或者已经是 有此cv限定符)


std::add_const
并不像您想象的那样:

如果T是引用、函数或顶级常量限定类型,则键入 应将同一类型命名为T,否则命名为T const

(摘自N4140中的20.10.7.1常量挥发性修改表52,重点矿山)

如您所见,
std::add_const
不会为引用类型添加
const


但是常量引用首先是什么,它们无论如何都是不可变的。(不要与引用
const
与引用非
const
相混淆)

std::add_const
并不像你想象的那样:

如果T是引用、函数或顶级常量限定类型,则键入 应将同一类型命名为T,否则命名为T const

(摘自N4140中的20.10.7.1常量挥发性修改表52,重点矿山)

如您所见,
std::add_const
不会为引用类型添加
const


但是常量引用首先是什么,它们无论如何都是不可变的。(不要与引用
const
与引用非
const
相混淆)

如果我们查看cpprefernece文档,我们会看到它说:

提供与T相同的成员typedef类型,只是添加了cv限定符(,除非T是函数、引用或已经有此cv限定符)

< >与C++标准草案20.107.1的挥发性变动一致,以下为<代码> AddioSconst >:

如果T是引用、函数或顶级const限定类型,则输入 应命名为与T相同的类型,否则命名为T const


如果我们查看cpprefernece文档,我们会看到它显示:

提供与T相同的成员typedef类型,只是添加了cv限定符(,除非T是函数、引用或已经有此cv限定符)

< >与C++标准草案20.107.1的挥发性变动一致,以下为<代码> AddioSconst >:

如果T是引用、函数或顶级const限定类型,则输入 应命名为与T相同的类型,否则命名为T const


引用不能限定为
const
,因此
std::add_const
对于引用类型是不可操作的


当您考虑它(和)时,它是有意义的,但乍一看可能会令人惊讶。

引用不能是
const
-限定的,因此
std::add_const
对于引用类型是不可操作的


当你思考它时,它是有意义的,但乍一看可能是令人惊讶的。

是的。C++是Python的“最不惊人原则”的对偶。你不必费心去简单地阅读文档。1@KarolyHorvath假设没有
const
限定的引用与C++中的“代码> const <代码>相反,你会想到什么“最不惊人的”?结果是?一个编译错误?虽然可能不那么令人惊讶,但它的可用性要低得多。@Angew:听起来合乎逻辑,对吧?当然。这并不意味着它不令人震惊。在C++中,一切都有一个原因:效率、可行性、可读性、互操作性、平台无关性、与其他功能的兼容性,或者一些历史遗留问题。如果你知道规则,没什么奇怪的……在这种情况下,正确的命名应该是
add\u const\u(如果可能的话)
,但是,嘿,我差点忘了,我们也喜欢简洁。@KarolyHorvath:也许我们的期望是
const
应该应用于引用的类型,也就是说,它应该变成
int*const&<但是,如果你需要的东西,比如“代码> STD::AddithCist: 或 STD::ISHONSist,那么你可能熟悉这些规则。它不是初学者使用的,或者是需要的。C++是Python的“最不惊人原则”的对偶。.你没有费心简单地阅读文档-1@KarolyHorvath在C++中,没有一个代码< >代码> const <代码> -限定引用(与引用<代码> const < /> >相反),你会期待什么“最不惊人”?结果是?一个编译错误?虽然可能不那么令人惊讶,但它的可用性要低得多。@Angew:听起来合乎逻辑,对吧?当然。这并不意味着它不令人震惊。在C++中,一切都有一个原因:效率、可行性、可读性、互操作性、平台无关性、与其他功能的兼容性,或者一些历史遗留问题。如果你知道规则,没什么奇怪的……在这种情况下,正确的命名应该是
add\u const\u(如果可能的话)
,但是,嘿,我差点忘了,我们也喜欢简洁。@KarolyHorvath:也许我们的期望是
const
应该应用于引用的类型,也就是说,它应该变成
int*const&std::add_const
std::is_const
这样的东西,那么你可能已经熟悉了这些规则。初学者不会使用或需要这些规则。