像这样的代码:
auto add(auto a, auto b) { return a + b; }
违反了ISO C++14标准吗?未来的标准版本是否允许编写这样的代码?
像这样的代码:
auto add(auto a, auto b) { return a + b; }
违反了ISO C++14标准吗?未来的标准版本是否允许编写这样的代码?
这是否违反了ISO c++14标准?
是的,在C++14(或C++17)中,您不能使用auto
声明带参数的函数。此代码是不合法的。
未来版本的标准是否允许编写这样的代码?
当前的概念TS确实允许这样做,通常称为简洁的函数模板语法。在概念中,其含义等同于:
template <class T, class U>
auto add(T a, U b) { return a + b; }
概念提议中的那部分还允许使用概念名称,而不仅限于auto
。现在尚不确定这是否会成为未来C++标准的一部分。
更新:该代码将在C++20中有效,并且具有与我上面展示的函数模板等效的含义(注意:a
和b
是独立推断的)。
template <typename T1, typename T2> int add(T1 a, T2 b);
或者,您可以使用lambda:
auto add = [](const auto& a, auto& b){ return a + b; };
这是泛型(多态)lambda表达式的提案。但是,泛型lambda是C++14的功能。
a
和b
必须具有相同的类型,并且在任何意义上都不等同于你的lambda或OP似乎要求的内容。 - Ryan Hainingint
?那绝对不等同于 OP 的代码。 - Praetorian目前这是无效的,但也许在未来版本的标准中,它将相当于:
template<typename T1, typename T2>
auto add(T1 a, T2 b) {return a + b;}
#define add(a,b) add_real_function<decltype(a),decltype(b)>(a,b)
template <typename T1,typename T2>
auto add_real_function(T1 a, T2 b) { return a + b; }
add_real_function
)必须与您想要为函数指定的名称(这里是add
)不同,后者必须是宏的名称。auto
替换为 T1
、T2
,然后可以移除宏定义。此外,你的版本也需要 C++20,因为它使用了与 OP 代码相同的特性。 - HolyBlackCatadd_real_function
的模板参数。 - HolyBlackCat