编写检查类型是否受numeric_limits支持的C++ Concept时编译报错,原因何在?
C++ Concept编译报错「return-type-requirement is not a type-constraint」原因解析
问题背景
想要编写一个C++ Concept,用于检查给定类型是否被std::numeric_limits库支持,编写测试代码后,使用g++ -std=c++23 test.cc编译时出现「return-type-requirement is not a type-constraint」错误,尽管std::numeric_limits明确支持int类型。
测试代码
// test.cc #include <limits> template<typename T> concept UsableType = requires(T v) { {std::numeric_limits<T>::min()} -> T; {std::numeric_limits<T>::max()} -> T; }; template<UsableType T> class MyClass { private: T val; public: void set(T v) { val = v; } }; int main() { MyClass<int> obj; obj.set(1); return 0; }
编译错误信息
test.cc:6:44: error: return-type-requirement is not a type-constraint 6 | {std::numeric_limits<T>::min()} -> T; | ^ test.cc:7:44: error: return-type-requirement is not a type-constraint 7 | {std::numeric_limits<T>::max()} -> T; | ^
报错原因及修正方案
原因
C++ Concept的requires表达式中,-> 后面的返回类型约束必须是类型约束,不能直接写类型T。类型约束指的是std::same_as<T>、std::convertible_to<T>这类符合约束语法的表达式,直接写类型不符合语法规则。
修正方案
方案1:验证返回值类型与T完全一致
如果需要确认std::numeric_limits<T>::min()和max()的返回值类型与T完全相同,需使用std::same_as<T>作为类型约束,同时要包含<concepts>头文件:
// 修正后的代码 #include <limits> #include <concepts> // 必须包含此头文件以使用std::same_as template<typename T> concept UsableType = requires(T v) { {std::numeric_limits<T>::min()} -> std::same_as<T>; {std::numeric_limits<T>::max()} -> std::same_as<T>; }; template<UsableType T> class MyClass { private: T val; public: void set(T v) { val = v; } }; int main() { MyClass<int> obj; obj.set(1); return 0; }
方案2:仅检查类型是否被std::numeric_limits支持
如果只需要验证std::numeric_limits<T>支持该类型(即min()和max()成员存在),可以去掉返回类型约束,简化为:
template<typename T> concept UsableType = requires(T v) { std::numeric_limits<T>::min(); std::numeric_limits<T>::max(); };
这种写法会检查std::numeric_limits<T>::min()和max()表达式是否合法,间接验证了类型T被std::numeric_limits支持。
内容的提问来源于stack exchange,提问作者Setu
相关产品推荐
相关产品推荐

