概念包含适用于函数,但不适用于结构

Concept subsumption working for functions, but not for structs

抱歉标题可能有误,这是我最好的猜测。

我正在学习一些基本概念并试过这个:

#include <concepts>
#include <iostream>
#include <memory>

template<typename T>
concept eight = sizeof(T) == 8;

template<typename T>
concept basic = std::is_trivial_v<T>;

template<typename T>
requires eight<T>
constexpr void ff(){
    std::cout << "eight" << std::endl;
}

template<typename T>
requires eight<T> && basic<T>
constexpr void ff(){
    std::cout << "eight and basic" << std::endl;
}

template<typename T>
requires eight<T>
struct ffs{
};

template<typename T>
requires eight<T> && basic<T>
struct ffs{
};

对我来说很疯狂的是,当相同的东西适用于函数时,我得到了结构的 error

:29:10: error: requires clause differs in template redeclaration requires eight && basic ^ :24:10: note: previous template declaration is here requires eight

可能是我在这两种情况下都只是 UB+NDRing 但编译器在第一种情况下并不介意(不是说当我从代码中删除结构时我的代码似乎 运行 正如预期的那样,包括正确区分根据概念调用什么),但这似乎不太可能。

P.S。如果有人想知道为什么我不使用 requires 而不是这里的琐碎概念,那就是 .

重载模板 类 在概念之前是不允许的,即使在概念中也仍然不允许。使用部分专业化:

template <typename T>
requires eight<T>
struct ffs {};

template <typename T>
requires basic<T>
struct ffs<T> {};

或者使用简洁的语法:

template <eight T>
struct ffs {};

template <basic T>
struct ffs<T> {};

请注意,在这两种情况下,对主模板的限制会自动应用于所有专业化。