代码是这样的:
auto add(auto a, auto b) { return a + b; }
违反ISO c ++ 14标准?该标准的未来版本是否允许代码编写?
答案 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中有效,并且具有与上面显示的函数模板相同的含义(注意:a
和b
是独立推导的。)
答案 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;}