概念包含适用于函数,但不适用于结构
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> {};
请注意,在这两种情况下,对主模板的限制会自动应用于所有专业化。
抱歉标题可能有误,这是我最好的猜测。
我正在学习一些基本概念并试过这个:
#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> {};
请注意,在这两种情况下,对主模板的限制会自动应用于所有专业化。