c++11 - 对静态常量成员大小的静态断言

标签 c++11 constexpr static-assert

我试图对 static const unordered_map 成员的大小进行静态断言。但我收到一条错误消息,指出静态断言的非常量条件。有人可以帮忙吗?

#include<unordered_map>
#include<string>

using namespace std;    

class A{
    public:
    static const unordered_map<string,string> strMap;
};

const unordered_map<string,string> A::strMap ={{"key","value"}};

int main() {
static_assert(A::strMap.size() == 1, "sizes don't match");
}

编辑:根据评论,我想澄清一下,以下代码工作正常(它使用数组而不是 map ):

#include<unordered_map>
#include<string>

using namespace std;    

class A{
    public:
    static const pair<string,string> strMap[];
};

const pair<string,string> A::strMap[] ={{"key","value"}};

int main() {
//static_assert(sizeof(A::strMap)/sizeof(A::strMap[0]) == 2, "sizes don't match");  Fails to compile
static_assert(sizeof(A::strMap)/sizeof(A::strMap[0]) == 1, "sizes don't match"); //Compiles fine
}

最佳答案

不能这样做。为此,您需要 constexpr std::unordered_map,但这是不可能的,因为它的构造函数不是 constexpr。当然,没有分配内存的类(unordered_map 就是这种类型)可以声明它的构造函数 constexpr。

关于c++11 - 对静态常量成员大小的静态断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899984/

相关文章:

c++ - 如何在编译时判断一个类型是否派生自模板类?

c++ - 为什么 std::make_pair 不返回一对?或者是吗?

c++ - 为什么 std::istringstream 在三元 (?:) 运算符中的解析结果与 std::ifstream 不同?

c++ - c++ 中内联函数的零成本列表

c++ - const_cast 和 std::move 从非引用中删除常量

c++ - constexpr 求值分支/constexpr 重载

c++ - 有什么方法可以将 static_assert 放入 ISO C++11 中的表达式中?

c++ - 排序时更改排序顺序是未定义的行为吗?

c++ - constexpr 数组未定义

c++ - 在命名空间中使用 constexpr double