constexpr函数返回类型是非const吗?

时间:2015-04-11 12:17:35

标签: c++

我已经读过constexpr函数返回类型可以是非常量的,在我的书中也有这样的代码:

constexpr bool isShorter(const string& str1, const string& str2)
{
    return str1.size() < str2.size();
}

str1.size()下有一个错误:constexpr函数返回非常量。根据这本书,它必须是正确的,但编制者不同意。

每次我在不同的代码中使用constexpr时,总会出现这样的错误:缺少类型说明符 - 假设为int。注意:C ++不支持default-int 。但我不知道这意味着什么。

2 个答案:

答案 0 :(得分:5)

不,返回值必须是至少一组可能输入的常量表达式。

N3797§7.1.5[dcl.constexpr] / 5说:

  

对于非模板,非默认的constexpr函数或a   非模板,非默认,非继承constexpr构造函数,if   没有参数值,以便调用函数或   构造函数可以是核心常量的计算子表达式   表达式(5.19),程序不正确;无需诊断。

由于std::string::size不是constexpr,因此不存在返回值为常量表达式的情况。

答案 1 :(得分:0)

constexpr表示函数返回编译器在程序运行之前可以确定的值。

const只是意味着该函数在被调用时不会在运行时更改对象。

std::string的内容在编译时未得到修复,因此size()方法为const(例如,调用它不会将包含数据"ABCD"的字符串更改为"ABCDEFG")但不是constexpr(std::string的长度在编译时没有固定,因为字符串可以在运行时填充 - 例如基于用户输入。)

这假设编译C ++ 11或更高版本 - 早期版本的C ++不支持constexpr