C++模板类中无法使用lambda初始化constexpr静态成员变量问题
问题原因
你当前的写法是将lambda函数对象本身直接赋值给size_t类型的ActualSize变量,二者类型不匹配,所以会报转换失败的错误。要获取lambda的执行结果,需要在lambda定义末尾添加调用运算符()。
正确实现
C++17标准支持constexpr lambda,你可以直接用如下写法实现编译期计算:
template <typename T, size_t MinSize> class Power2Container { private: T* Buffer; static constexpr size_t ActualSize = []() constexpr -> size_t { size_t v = MinSize; v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }(); // 此处添加()调用lambda获取返回值 };
补充说明
- 这里不需要设置任何捕获符,模板参数
MinSize属于类作用域内的编译期常量,lambda可以直接访问 - VS2019对C++17的constexpr lambda特性支持完整,上述写法可以正常编译通过
内容的提问来源于stack exchange,提问作者Eyal K.
相关产品推荐
相关产品推荐

