c++ - 您可以在命名空间范围内使用 auto 定义类静态常量吗?
问题描述
在c++中,可以从定义中定义const
static
数据成员,class
而无需在命名空间范围内定义它。只要不使用 ODR 常量,这样做就是有效的;这种做法实际上并没有在翻译单元中提供存储支持。例如:
#include <cstddef> // std::size_t
class my_string
{
public:
static const auto npos = static_cast<std::size_t>(-1);
};
我喜欢在可能的情况下遵循几乎总是自动的准则,以实现一致的从左到右的可读性,同时保持打字通用。但是,这与您可能实际上希望该符号可能被 ODR 使用的少数情况不一致。我想做的是:
#include "my_string.hpp"
const auto my_string::npos; // error!
但是,由于未指定类型,即使在 c++20 下也会失败——尽管此时decltype(my_string::npos)
已经知道这一事实。理想情况下,如果常量的类型发生更改,我希望命名空间定义不需要更改。
我的问题是:有没有办法在这种情况下实现简单的从左到右的语法?
我能想到的解决这个问题的唯一两种方法是要么不使用c++17的inline
变量指定命名空间定义,要么使用 using 命名类型decltype(my_string::npos)
(虽然丑陋,但确实有效)。
解决方案
尽管此时已经知道 decltype(my_string::npos)
好吧..所以就用它吧!
#include <cstddef> // std::size_t
class my_string {
public:
static const auto npos = static_cast<std::size_t>(-1);
};
const decltype(my_string::npos) my_string::npos; // all fine!
推荐阅读
- typescript - 当我遇到错误时,如何通过 Webpack Encore 设置强制 TypeScript 不编译为 JS
- reactjs - React JS 无法使用 npm start 或 yarn start 运行
- python - AttributeError:模块'numbers'在scripy中没有属性'Integral'
- parsing - 如何在antlr4中使用Listener方法获取解析器的内容?
- python - py2exe 不工作 - 闪烁控制台并关闭
- python - 带有旋转/缩放/剪切/平移提取的 3D 点云配准(知道对应关系)
- javascript - 如何使用双向数据绑定将一个文本替换为另一个文本?
- python - 为什么我的 val_loss 下降但我的 val_accuracy 停滞不前
- ruby-on-rails - 在 kubernetes 中运行 rails + postgres:连接被拒绝
- flutter - 如何在 Firestore 查询中使用 DocumentReference