为什么我不能递增简单constexpr函数的参数?

时间:2016-07-30 13:56:50

标签: c++ c++11 visual-c++ c++14 constexpr

Visual Studio 2015 Update 3。

我读了编程。 Bjarne Stroustrup 使用C ++的原理和实践(第二版)。我学习了constexpr函数......

有效:

constexpr int get_value(int n) {
    return n + 1;
}

但是我无法编译它(而不是第一个变体):

constexpr int get_value(int n) {
    return ++n;
}

我收到错误:

  

constexpr函数返回非常量

nget_value函数的 local 变量。即n变量不会影响外部代码。

为什么get_value函数的第二个变体是错误的?

2 个答案:

答案 0 :(得分:4)

C ++ 11 constexpr中不允许使用第二个。该标准甚至有一个非常相似的例子(N3337 [dcl.constexpr] / 3):

constexpr int prev(int x)
{ return --x; } // error: use of decrement

N3337 [expr.const] / 2在常量表达式中明确禁止“递增或递减操作”。

C ++ 14扩展constexpr放宽了这些要求,但MSVC没有实现这一点。

答案 1 :(得分:2)

第二个在C ++ 14下是合法的,但它不能编译,因为Visual Studio 2015仅部分支持constexpr函数。它只支持单返回constexpr函数和其他限制(如你的),这些限制在C ++ 11中有效。

请参阅this文章(constexpr段落中)。 Visual Studio“15”将改进constexpr函数。你必须等一下:)