【发布时间】:2019-09-13 23:07:54
【问题描述】:
在这个概念定义中:
#include <utility>
template<class Func, class Ret, class... Args>
concept Invokable = requires(Func f) {
{ f(std::declval<Args>()...) } -> Ret;
};
当像这样实例化时:
static_assert(Invokable<decltype([](int){}), void, int>);
gcc-9.0.1(主干)转储(准确地说是标准库实现):
$ g++ -O2 -std=c++2a -fconcepts -Wall -Wextra -Werror -c tu1.cpp error: static assertion failed: declval() must not be used! 2204 | static_assert(__declval_protector<_Tp>::__stop, | ^~~~~~
演示:https://godbolt.org/z/D0ygU4
拒绝此代码有错吗?如果没有,我做错了什么?如果是,应该在哪里报告这个错误?
注意事项
已接受
template<auto f, class... Args>
constexpr auto size_of_return_type = sizeof(f(std::declval<Args>()...));
当像这样实例化时:
static_assert(sizeof(int) == size_of_return_type<[](int){ return 0; }, int>);
演示:https://godbolt.org/z/gYGk8U
最新的 C++2a 草案状态:
[expr.prim.req]/2requires-expression 是 bool 类型的纯右值,其值如下所述。出现在需求主体中的表达式是未计算的操作数。
【问题讨论】:
标签: c++ g++ c++-concepts c++20