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函数返回非常量
n
是get_value
函数的 local 变量。即n
变量不会影响外部代码。
为什么get_value
函数的第二个变体是错误的?
答案 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
函数。你必须等一下:)