代码是这样的:
auto add(auto a, auto b) { return a + b; }
字符串是否违反ISO C++14标准?未来的标准版本会允许这样写代码吗?
yeotifhr1#
[Does是否违反了ISO C14标准?是的,你不能在C14(或C++17)中使用auto声明带参数的函数。此代码格式不正确。未来的标准版本会允许这样写代码吗?当前的Concepts TS允许这样做,它通常被称为简洁的函数模板语法。在Concepts中,其含义等同于:
auto
template <class T, class U> auto add(T a, U b) { return a + b; }
字符串Concepts提案的这一部分还允许使用概念名称,而不仅仅是auto。这是否会成为未来C标准的一部分是一个悬而未决的问题。更新:代码在C20中有效,并且具有与我上面展示的函数模板相同的含义(注意:a和b是独立推导的)。
a
b
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的特性。*
ivqmmu1c3#
目前这是无效的,但在标准的未来版本中,它可能相当于:
template<typename T1, typename T2> auto add(T1 a, T2 b) {return a + b;}
字符串
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)不同,后者必须是宏的名称。不幸的是,这种解决方法有一个缺点,即您无法创建指向这类函数的函数指针。
add_real_function
add
4条答案
按热度按时间yeotifhr1#
[Does是否违反了ISO C14标准?
是的,你不能在C14(或C++17)中使用
auto
声明带参数的函数。此代码格式不正确。未来的标准版本会允许这样写代码吗?
当前的Concepts TS允许这样做,它通常被称为简洁的函数模板语法。在Concepts中,其含义等同于:
字符串
Concepts提案的这一部分还允许使用概念名称,而不仅仅是
auto
。这是否会成为未来C标准的一部分是一个悬而未决的问题。更新:代码在C20中有效,并且具有与我上面展示的函数模板相同的含义(注意:
a
和b
是独立推导的)。rkue9o1l2#
如果你希望这意味着你可以向函数传递任何类型,让它成为一个模板:
字符串
或者,您可以使用lambda:
型
Proposal for Generic (Polymorphic) Lambda Expressions * 但是,泛型lambda表达式是C++14的特性。*
ivqmmu1c3#
目前这是无效的,但在标准的未来版本中,它可能相当于:
字符串
whhtz7ly4#
对于C++ 20及更高版本,这是有效的,并将按照您可能期望的方式运行。
对于不支持C++ 20的编译器,有一个解决方案,使用函数宏和模板:
字符串
请记住,函数的真实的名称(此处为
add_real_function
)必须与您希望为函数给予的名称(此处为add
)不同,后者必须是宏的名称。不幸的是,这种解决方法有一个缺点,即您无法创建指向这类函数的函数指针。