【发布时间】:2017-07-03 23:56:52
【问题描述】:
我正在尝试了解尚未合并到标准中的 Concepts Lite TS。我对概念体中短路析取的行为感到困惑。
这是一个小例子:
#include <type_traits>
#include <iostream>
template <typename T, typename ... Ts> concept bool myconcept =
(sizeof...(Ts) == 0) || (std::is_same_v<T, std::common_type_t<Ts...>>);
template <typename ... Ts>
void myfunc(Ts ... args) requires myconcept<int, Ts...> {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
用 gcc 7.1 和 -fconcepts 编译,报错:
error: cannot call function 'void myfunc(Ts ...) requires myconcept<int, Ts ...> [with Ts = {}]'
在此示例中,std::common_type_t<Ts...> 不存在,因为如果 Ts = {} 结构 std::common_type<Ts...> 没有成员 type。但是,我认为这应该可以编译,因为 cppereference.com 在concepts and constraints 上的文档指出
从左到右评估析取并短路(如果满足左约束,则不尝试将模板参数推导到右约束中)。
由于满足sizeof...(Ts) == 0,因此不应在第二个约束上尝试模板参数推导,并且应满足要求myconcept<int, Ts...>。
奇怪的是,将需求直接放入函数声明器会导致程序编译:
#include <type_traits>
#include <iostream>
template <typename ... Ts>
void myfunc(Ts ... args) requires (sizeof...(Ts) == 0) || (std::is_same_v<int, std::common_type_t<Ts...>>) {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
对这种行为有很好的解释吗? 谢谢。
【问题讨论】:
-
"Concepts Lite TS 尚未合并到标准中" 我在哪里可以找到此信息?我最后的信息是它没有被接受......
标签: c++ c++-concepts