C++ C++;在函数声明和其他任何地方,符号右边的常量

C++ C++;在函数声明和其他任何地方,符号右边的常量,c++,C++,这: 具有与此相同的含义: void foo(const std::string & bar); 1.)但如果我这样做会发生什么: void foo(std::string const& bar); void foo(std::string &const bar); 这是否意味着参数本身的地址是常量?你为什么要这样做 2.)此外,如果我这样做会发生什么: void foo(std::string const& bar); void foo(std::str

这:

具有与此相同的含义:

void foo(const std::string & bar);
1.)但如果我这样做会发生什么:

void foo(std::string const& bar);
void foo(std::string &const bar);
这是否意味着参数本身的地址是常量?你为什么要这样做

2.)此外,如果我这样做会发生什么:

void foo(std::string const& bar);
void foo(std::string &const bar);

?

这意味着
bar
是对(非常量)字符串的常量引用。这没有任何意义,因为您无论如何都不能更改引用。它也是无效的,因为引用类型不能是常量

在使用指针时,将
const
放置在那里会起作用,也有意义,例如

std::string &const bar
这意味着
bar
是指向(非常量)字符串的常量指针。变量
bar
是常量,不能使
bar
指向其他任何地方。例如:

std::string * const bar
宣言

std::string * const bar = new std::string("foo");
bar = new std::string("bar");  // Invalid as `bar` is constant
*bar = "bar";  // Valid because the string object itself is not constant
是多余的,因为它说
bar
是对常量
std::string
的引用,该常量是常量

至于

const std::string const& bar
这根本不是有效的语法,因为不能在那里放置

这意味着
bar
是对(非常量)字符串的常量引用。这没有任何意义,因为您无论如何都不能更改引用。它也是无效的,因为引用类型不能是常量

在使用指针时,将
const
放置在那里会起作用,也有意义,例如

std::string &const bar
这意味着
bar
是指向(非常量)字符串的常量指针。变量
bar
是常量,不能使
bar
指向其他任何地方。例如:

std::string * const bar
宣言

std::string * const bar = new std::string("foo");
bar = new std::string("bar");  // Invalid as `bar` is constant
*bar = "bar";  // Valid because the string object itself is not constant
是多余的,因为它说
bar
是对常量
std::string
的引用,该常量是常量

至于

const std::string const& bar
这根本不是有效的语法,因为不能在那里放置

void foo(std::string const&bar)

“bar”的类型是“const std::string&”

void foo(标准::字符串和常量条)

“bar”的类型是“std::string&”。这里的“const”没用

void foo(const std::string const&bar)

“bar”的类型是“const std::string&”。第二个常量没有用

void foo(标准::字符串和条形常量)

编译语法错误

void foo(std::string const&bar)

“bar”的类型是“const std::string&”

void foo(标准::字符串和常量条)

“bar”的类型是“std::string&”。这里的“const”没用

void foo(const std::string const&bar)

“bar”的类型是“const std::string&”。第二个常量没有用

void foo(标准::字符串和条形常量)


编译语法错误。

也许可以试试<代码>常量绑定到左侧,如果有东西,则绑定到右侧。顺便说一句,没有常量引用(只引用常量),但是常量指针是一种东西。也许可以试试<代码>常量绑定到左侧,如果有东西,则绑定到右侧。顺便说一句,没有常量引用(仅引用常量),但常量指针是一种东西。您确定
std::string&const bar
是有效的声明吗?g++和clang都不接受这个声明。@不,我不接受。不,它不是。更新了答案以反映它。谢谢您指出。您确定
std::string&const bar
是有效的声明吗?g++和clang都不接受这个声明。@不,我不接受。不,它不是。更新了答案以反映它。谢谢你指出这一点。