我有以下代码:
const string getConstString()
{
return "MyConstString";
}
int main()
{
string str1 = getConstString();
cout << str1 << endl;
}
const关键字在这有什么影响?
答案 0 :(得分:4)
一个值得注意的效果是您无法从const
结果移动。
在C ++获得对C ++ 11中移动语义的直接支持之前,一个并不常见的建议是使返回类型const
强制客户端代码仅以有意义的方式使用结果作为值(和不是一个可变对象)。
在C ++ 11之后,建议恰恰相反:不要返回值const
,因为这会阻止移动。
示例:
#include <iostream>
#include <string>
using namespace std;
auto m() -> string { return {}; }
auto c() -> const string { return {}; }
void check( string&& ) { cout << "mutable\n"; }
void check( string const&& ) { cout << "const\n"; }
auto main()
-> int
{
check( m() );
check( c() );
}
此输出
mutable const
...显示函数const
的结果c
对调用代码非常明显。
使用int
代替string
,输出相反为2דmutable
”,在内置类型和类类型的处理方面显示出微妙且惊人的差异:对于内置类型的结果,例如const
,将忽略级别int
。
“类prvalues可以具有cv限定类型;非类prvalue总是有cv不合格的类型。
值得注意的是,这是 prvalue表达式的规则,而不是函数声明的重写规则,如数组的衰减到指针类型或函数类型形式参数。即,函数的类型不受影响。 const
仍然存在于类型中:
#include <iostream>
#include <type_traits> // std::is_same
using namespace std;
#define STATIC_ASSERT( e ) static_assert( e, #e " <- is needed." )
auto c() -> const int{ return {}; }
auto main()
-> int
{
// Function type:
STATIC_ASSERT(( is_same<decltype( c ), auto()->const int>::value ));
STATIC_ASSERT(( not is_same<decltype( c ), auto()->int>::value ));
// prvalue type:
STATIC_ASSERT(( is_same<decltype( c() ), int>::value ));
STATIC_ASSERT(( not is_same<decltype( c() ), int const>::value ));
}