首页 > 解决方案 > 为什么类静态 constexpr 值不能依赖于类静态 constexpr 函数?

问题描述

任何人都知道以下是否有问题或是否是错误?

#include <utility>

struct X {
    template <typename...Ts>
    static constexpr std::size_t fn() {
        return 1;
    }
    static constexpr std::size_t value = fn();
};

Demo

看起来 msvc 19.22 似乎没问题,但 clang 和 gcc 不喜欢它。

如果我将 fn() 模板移到结构外部,它可以正常工作。铿锵声 说:

error: constexpr variable 'value' must be initialized by a constant expression

和 gcc 说:

static constexpr std::size_t X::fn() [with Ts = {}; std::size_t = long unsigned int]' used before its definition

另外,以后不能定义:

struct X {
    template <typename...Ts>
    static constexpr std::size_t fn() {
        return 1;
    }
    static constexpr std::size_t value;
};
constexpr std::size_t X::value = X::fn();

Demo

但是,它可以指定为 constexpr 函数:

struct X {
    template <typename...Ts>
    static constexpr std::size_t fn() {
        return 1;
    }
    static constexpr std::size_t value() {
        return fn();
    }
};

Demo

这似乎是由于该类在使用时不完整引起的。如果是这样,这似乎是一个缺陷,因为静态成员 vars/fns 不依赖于类。

编辑

谢谢@Rakete1111。查看您提供的副本,我从标准中得到了这个引用(强调我的):

9.4.2 [class.static.data] p3: ... 文字类型的静态数据成员可以在类定义中使用 constexpr 说明符声明;如果是这样,它的声明应指定一个大括号或等式初始化器,其中作为赋值表达式的每个初始化器子句都是一个常量表达式。

as canmust不同,这进一步表明了我的第二个示例应该起作用的缺陷。

标签: c++constexpr

解决方案


推荐阅读