使用`auto`作为针对C ++标准的函数参数?

时间:2017-07-07 21:00:35

标签: c++ c++14

代码是这样的:

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

违反ISO c ++ 14标准?该标准的未来版本是否允许代码编写?

3 个答案:

答案 0 :(得分:7)

  

[这是否违反了ISO c ++ 14标准?

是的,你不能在C ++ 14(或C ++ 17)中使用auto来声明使用参数的函数。这段代码格式不正确。

  

该标准的未来版本是否允许代码编写?

当前的Concepts TS允许这样做,它通常被称为简洁的函数模板语法。在Concepts中,含义等同于:

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

概念提案的那部分也允许使用概念名称,而不仅仅是auto。关于这是否将成为未来C ++标准的一部分,这是一个悬而未决的问题。

更新:代码在C ++ 20中有效,并且具有与上面显示的函数模板相同的含义(注意:ab是独立推导的。)

答案 1 :(得分:3)

如果您希望这意味着您可以将任何类型传递给函数,请将其设为模板:

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的一个特性。

答案 2 :(得分:1)

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

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