关于AFT(缩写功能模板)有何争议?

时间:2018-08-21 17:44:44

标签: c++ c++-concepts c++20

为什么看到此功能有争议?我看到它没有与Concepts TS的其余部分合并到C ++ 20中。通过网络搜索,除了可以应用于几乎所有新的C ++功能的通用参数之外,我找不到合理的参数。

人们最怕什么?那里可能有什么陷阱?毕竟,我们已经有了通用的lambda。

1 个答案:

答案 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

鉴于似乎每个对此主题大声疾呼的人都是该论文的合著者,所以我给它比平均成功的机会要好。