我可以在 using 声明中正确使用 C++20 概念吗?
Can I use C++20 concepts properly in a using declaration?
我尝试了一些 C++20 中提供的概念并想出了一个简单的例子,令我惊讶的是,does not produce the expected results(请留下任何关于我的例子的有用性的讨论:-)):
#include <iostream>
#include <type_traits>
#include <vector>
template <typename T>
concept i_am_integral = requires { std::is_integral_v<T> == true; };
template <typename T> requires i_am_integral<T>
using intvector = std::vector<T>;
int main() {
intvector<int> v = { 1, 2, 3 }; // <- This is fine, int is an integral type
// I would expect this to fail:
intvector<double> w = { 1.1, 2.2, 3.3 };
// I'm curious, so let's print the vector
for (auto x : w) { std::cout << x << '\n'; }
// Same here - IMO, this should fail:
struct S{};
intvector<S> s;
}
我试图让 intvector
成为 "restricted" std::vector
,它只允许采用整数类型。但是,intvector
似乎像原始向量一样吞没了任意类型,包括用户定义的类型。
这是我的错还是 clang 还不够稳定,无法正确处理这种情况?我怀疑混合类型别名和要求存在问题(如 中所述),但我无法理解它 - 特别是,我的示例编译,而引用的 post 中的示例不编译't.
你的想法:
template <typename T>
concept i_am_integral = requires { std::is_integral_v<T> == true; };
不检查类型是否为整型。相反,它检查是否可以将 std::is_integral_v<T>
与 true
进行比较(这总是可能的)。要修复您的代码,您应该这样做:
template <typename T>
concept i_am_integral = std::is_integral_v<T>;
我尝试了一些 C++20 中提供的概念并想出了一个简单的例子,令我惊讶的是,does not produce the expected results(请留下任何关于我的例子的有用性的讨论:-)):
#include <iostream>
#include <type_traits>
#include <vector>
template <typename T>
concept i_am_integral = requires { std::is_integral_v<T> == true; };
template <typename T> requires i_am_integral<T>
using intvector = std::vector<T>;
int main() {
intvector<int> v = { 1, 2, 3 }; // <- This is fine, int is an integral type
// I would expect this to fail:
intvector<double> w = { 1.1, 2.2, 3.3 };
// I'm curious, so let's print the vector
for (auto x : w) { std::cout << x << '\n'; }
// Same here - IMO, this should fail:
struct S{};
intvector<S> s;
}
我试图让 intvector
成为 "restricted" std::vector
,它只允许采用整数类型。但是,intvector
似乎像原始向量一样吞没了任意类型,包括用户定义的类型。
这是我的错还是 clang 还不够稳定,无法正确处理这种情况?我怀疑混合类型别名和要求存在问题(如
你的想法:
template <typename T>
concept i_am_integral = requires { std::is_integral_v<T> == true; };
不检查类型是否为整型。相反,它检查是否可以将 std::is_integral_v<T>
与 true
进行比较(这总是可能的)。要修复您的代码,您应该这样做:
template <typename T>
concept i_am_integral = std::is_integral_v<T>;