首页 > 解决方案 > 您可以在命名空间范围内使用 auto 定义类静态常量吗?

问题描述

中,可以从定义中定义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)已经知道这一事实。理想情况下,如果常量的类型发生更改,我希望命名空间定义不需要更改。

我的问题是:有没有办法在这种情况下实现简单的从左到右的语法?

我能想到的解决这个问题的唯一两种方法是要么不使用inline变量指定命名空间定义,要么使用 using 命名类型decltype(my_string::npos)(虽然丑陋,但确实有效)。

标签: c++

解决方案


尽管此时已经知道 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!

推荐阅读