2016-07-30 59 views
0

Visual Studio 2015更新3.为什么我不能递增简单constexpr函数的参数?

我读了编程。使用C++的原理和实践(第二版)作者:Bjarne Stroustrup。我学习constexpr功能...

它的工作原理:

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

但我不能编译这个(而不是第一个变体):

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

我得到的错误:

constexpr function return is non-constant

n本地变量为get_value函数。即n变量不会影响外部代码。

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

+2

尝试一个合适的编译器。 – Columbo

+0

我用'g ++ 5.3.1'在'codeblock'中引用并启动。 –

+0

@ k-five,嗯...也许我的问题是特定于IDE,我使用... –

回答

3

第二个不允许在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并未实现该要求。

+0

嗯......为什么被禁止?它有什么危险? –

+0

@AndreyBushman:没有危险,只是规格纯度:_不允许突变。这个限制在C++ 14中消失了,因为它允许一般的变异,这不仅仅是因为增量和减量操作不再单独出现。 – ildjarn

2

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

请参阅this文章(在constexpr段落中)。 Visual Studio“15”将为constexpr功能带来改进。你必须等一下:)

相关问题