函数参数使用auto是否违反C++标准?

3zwtqj6y  于 2023-08-09  发布在  其他
关注(0)|答案(4)|浏览(75)

代码是这样的:

auto add(auto a, auto b) { return a + b; }

字符串
是否违反ISO C++14标准?未来的标准版本会允许这样写代码吗?

yeotifhr

yeotifhr1#

[Does是否违反了ISO C14标准?
是的,你不能在C
14(或C++17)中使用auto声明带参数的函数。此代码格式不正确。
未来的标准版本会允许这样写代码吗?
当前的Concepts TS允许这样做,它通常被称为简洁的函数模板语法。在Concepts中,其含义等同于:

template <class T, class U>
auto add(T a, U b) { return a + b; }

字符串
Concepts提案的这一部分还允许使用概念名称,而不仅仅是auto。这是否会成为未来C标准的一部分是一个悬而未决的问题。
更新:代码在C
20中有效,并且具有与我上面展示的函数模板相同的含义(注意:ab是独立推导的)。

rkue9o1l

rkue9o1l2#

如果你希望这意味着你可以向函数传递任何类型,让它成为一个模板:

template <typename T1, typename T2> int add(T1 a, T2 b);

字符串
或者,您可以使用lambda:

auto add = [](const auto& a, auto& b){ return a + b; };


Proposal for Generic (Polymorphic) Lambda Expressions * 但是,泛型lambda表达式是C++14的特性。*

ivqmmu1c

ivqmmu1c3#

目前这是无效的,但在标准的未来版本中,它可能相当于:

template<typename T1, typename T2>
auto add(T1 a, T2 b) {return a + b;}

字符串

whhtz7ly

whhtz7ly4#

对于C++ 20及更高版本,这是有效的,并将按照您可能期望的方式运行。
对于不支持C++ 20的编译器,有一个解决方案,使用函数宏和模板:

#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)不同,后者必须是宏的名称。
不幸的是,这种解决方法有一个缺点,即您无法创建指向这类函数的函数指针。

相关问题