const在函数返回类型之前有什么影响?

时间:2016-10-06 10:49:25

标签: c++

我有以下代码:

const string getConstString()
{
    return "MyConstString";
}

int main()
{
    string str1 = getConstString();
    cout << str1 << endl;
}

const关键字在这有什么影响?

1 个答案:

答案 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

C ++11§3.10/ 4(basic.lval / 4):
  

类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 ));
}