我有以下代码:
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时,出现以下错误:
显然
log2
是constexpr
,所以我认为这只是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/