我有以下代码:

constexpr int log2(const unsigned int x) {
    return x < 4 ? 1 : 1 + log2(x / 2);
}

int main() {
    bitset<log2(2)> foo;
    int bar[log2(8)];

    cout << log2(8) << endl;
}

在gcc中工作正常:https://ideone.com/KooxoS

但是当我尝试visual-studio-2017时,出现以下错误:



显然log2constexpr,所以我认为这只是visual-studio-2017中的错误。有办法解决这个错误吗?

最佳答案

看来您的项目包含标准的std::log2函数,编译器将其与log2函数混淆。即使您不使用#include <cmath>,也会发生这种情况,因为标准 header 允许包含任何其他标准 header 。这也是using namespace std;回火的另一个示例。

一种解决方案是将constexpr函数重命名为其他名称:

#include <bitset>
#include <iostream>

using namespace std;

constexpr int logTwo(const unsigned int x) {
    return x < 4 ? 1 : 1 + logTwo(x / 2);
}

int main() {
    bitset<logTwo(2)> foo;
    int bar[logTwo(8)];

    cout << logTwo(8) << endl;
}

Demo

编辑:在这种情况下,using namespace std;似乎不相关。无论如何,标准log2函数可能在全局 namespace 中可用。

关于c++ - 解决Visual Studio中被忽略的constexpr吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56582631/

10-11 22:54