【问题标题】:Why I can't increment the parameter of the simple constexpr function?为什么我不能增加简单 constexpr 函数的参数?
【发布时间】:2016-07-30 13:56:49
【问题描述】:

Visual Studio 2015 更新 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 函数的本地 变量。 IE。 n 变量变化不影响外部代码。

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

【问题讨论】:

  • 尝试一个合适的编译器。
  • 我在codeblockg++ 5.3.1 中测试并醒来。
  • @k-five,嗯...也许我的问题是特定于我使用的 IDE...

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


【解决方案1】:

第二个在 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 没有实现。

【讨论】:

  • 嗯...为什么它被禁止了?有什么危险?
  • @AndreyBushman :没有危险,只是规范的纯度:不允许突变。 C++14 的限制消失了,因为它通常允许变异,而不仅仅是因为不再单独选择递增和递减操作。
【解决方案2】:

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

参见this 文章(在constexpr 段落中)。 Visual Studio "15" 将带来对constexpr 函数的改进。你得等一会儿:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2019-08-17
    • 2018-06-05
    相关资源
    最近更新 更多