为什么看到此功能有争议?我看到它没有与Concepts TS的其余部分合并到C ++ 20中。通过网络搜索,除了可以应用于几乎所有新的C ++功能的通用参数之外,我找不到合理的参数。
人们最怕什么?那里可能有什么陷阱?毕竟,我们已经有了通用的lambda。
答案 0 :(得分:9)
考虑以下程序:
void foo(Name&& x) {
static int counter = 0;
++counter;
x.func<int>(); // #1
}
Name x = ...;
foo(x); // #2
template <typename T> void some_algorithm(T);
some_algorithm(foo); // #3
如果Name
是一个类型,则有一个名为counter
的静态变量,foo
是一个带有右值引用的单个函数,在#1
中的调用是很好(假设存在这样的成员函数),#2
中的调用格式错误,因为x
是左值; #3
中的调用格式正确,因为{{1} }会衰减为函数指针。
如果foo
是一个概念,则每个实例化的类型(包括不同的值类别)都有一个静态变量,Name
是只能在标头中定义的函数模板,{ {1}}格式错误,因为您需要一个额外的foo
关键字,#1
中的调用格式正确,因为我们只是推导了一个左值引用参数,而对template
的调用格式错误,因为您不能传递这样的函数模板-您需要将其包装在lambda或其他内容中。
这堆叠在每个参数上:
#2
名称可以是类型或没有标记的概念。
全部基于事物#3
的类别。那是个很大的差异(请注意,上述内容也不是差异的完整列表,只是我可以立即想到的最大差异),并且担心它太多了没有相应的利益。
另请参阅P0696。
请注意,这都不适用于通用lambda和void foo(Name&&, OtherName&&);
,因为Name
是关键字,因此auto
显然是函数模板。这是一个明确的标记,可以避免所有这些歧义。
还要注意,P1141建议对AFT使用相同的语法标记:
auto
鉴于似乎每个对此主题大声疾呼的人都是该论文的合著者,所以我给它比平均成功的机会要好。