Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++_C++11 - Fatal编程技术网

C++ 关于自动到恒定参考的澄清

C++ 关于自动到恒定参考的澄清,c++,c++11,C++,C++11,在此代码中: int a=8; const int &b = a; //b is a Low-Level const auto c = b; 我希望c是常量int类型,因为它已被autoed设置为低级别常量。但是,它是指a(其别名为b)而不是b,用于其声明 c仅当像auto&c=b 据我所知,只有顶级常量被删除。有人能解释一下我的理解有什么问题吗 而对于指针,低电平常量由auto拾取: int i=9; const int * p=&i; auto *d

在此代码中:

int a=8; 
const int &b = a;           //b is a Low-Level const
auto c = b; 
我希望
c
是常量int类型,因为它已被
auto
ed设置为低级别常量。但是,它是指
a
(其别名为
b
)而不是
b
,用于其声明

c
仅当像
auto&c=b

据我所知,只有顶级常量被删除。有人能解释一下我的理解有什么问题吗

而对于指针,低电平常量由
auto
拾取:

int i=9;
const int * p=&i;
auto *d=p;
*d=45;   // error: assignment of read-only location ‘* d’

.

自动使用模板类型扣除规则。它的长与短之处在于,使用
auto
时会删除引用(这就是为什么您会将
decltype(auto)
之类的内容视为函数的返回,因为这使用了一组不同的类型推断规则)


Scott Meyers在有效的现代C++第2条中详细地介绍了规则。

< P> AutoUp使用模板类型演绎规则。它的长与短之处在于,使用
auto
时会删除引用(这就是为什么您会将
decltype(auto)
之类的内容视为函数的返回,因为这使用了一组不同的类型推断规则)


Scott Meyers在有效的现代C++第2条中详细地介绍了规则。在第一个例子中,

是链接的,但是C变成常数,这是因为B的作用。第二个例子的问题是*d是不能修改的const int类型


希望这有帮助。

在第一个示例中,b和a是链接的,但是c变为常量,这是因为b中的常量生效。第二个例子的问题是*d是不能修改的const int类型


希望这有帮助。

表达式的类型永远不是引用类型。表达式具有非引用类型和值类别

声明
const int&b=a表示:

  • 将有一个名为
    b
    的变量
  • 表达式
    b
    的类型为
    const int
  • 表达式
    b
    指定与
    a
    相同的对象。换句话说,名称
    a
    b
    都指同一个对象
  • 代码
    decltype(b)
    解析为
    const int&
    ,但除此之外,您无法访问引用的“历史记录”。一旦它被绑定,它只是一个int的名字
autoc=X
表示
c
未声明为引用;它的类型是从表达式
X
的类型推导出来的。如果
X
恰好是变量的标识符,则不会调用任何特殊规则
X
在所有情况下都被视为表达式

语法
decltype(auto)C=X存在;如果X是变量的名称,那么这意味着C的声明方式与X相同。(如果X不是变量的名称,那么行为也取决于X的值类别)

在第一个示例中,
c
是从表达式
b
的类型推导出来的,它是
const int
。正如您所注意到的,顶级常量在这里被删除,因此
autoc
意味着
intc


在第二个示例中,表达式
p
的类型是
const int*
。这不是顶级常量,因此
autod=p将是
const int*d=p。在这种情况下,
auto*d
auto-d

没有区别,表达式的类型永远不是引用类型。表达式具有非引用类型和值类别

声明
const int&b=a表示:

  • 将有一个名为
    b
    的变量
  • 表达式
    b
    的类型为
    const int
  • 表达式
    b
    指定与
    a
    相同的对象。换句话说,名称
    a
    b
    都指同一个对象
  • 代码
    decltype(b)
    解析为
    const int&
    ,但除此之外,您无法访问引用的“历史记录”。一旦它被绑定,它只是一个int的名字
autoc=X
表示
c
未声明为引用;它的类型是从表达式
X
的类型推导出来的。如果
X
恰好是变量的标识符,则不会调用任何特殊规则
X
在所有情况下都被视为表达式

语法
decltype(auto)C=X存在;如果X是变量的名称,那么这意味着C的声明方式与X相同。(如果X不是变量的名称,那么行为也取决于X的值类别)

在第一个示例中,
c
是从表达式
b
的类型推导出来的,它是
const int
。正如您所注意到的,顶级常量在这里被删除,因此
autoc
意味着
intc


在第二个示例中,表达式
p
的类型是
const int*
。这不是顶级常量,因此
autod=p将是
const int*d=p。在这种情况下,
auto*d
auto d

没有什么不同,因此只从表达式中删除引用,而不是指针,因此&attached with declarator b被删除,但是*attached with p不是?@AgrudgeAmicus指针声明器声明变量具有指针类型;引用声明器声明变量具有目标类型,并且将通过绑定到其他可能已经存在的对象来初始化该变量。因此,只有引用从表达式中删除,而不是指针,因此&attached with declarator b被删除,但是*attach