C++ C++;14自动扣除错误:函数返回数组

C++ C++;14自动扣除错误:函数返回数组,c++,arrays,auto,c++14,C++,Arrays,Auto,C++14,社区! 我正在尝试应用新的C++14功能,但在尝试将const char[]参数传递给下面给出的函数时意外遇到错误: decltype(auto) autofunc( const auto& a) { cout<<"Hello World\n"; cout<<a<<endl; } auto lambd = [](const auto& word){ autofunc(std::forward< decl

社区! 我正在尝试应用新的C++14功能,但在尝试将const char[]参数传递给下面给出的函数时意外遇到错误:

 decltype(auto) autofunc( const auto& a)
 {
     cout<<"Hello World\n";
     cout<<a<<endl;

 }


 auto lambd = [](const auto& word){  autofunc(std::forward< decltype(word) > (word));};

int main()
{


 lambd("Goodbye World\n");


    return 0;
}
decltype(auto)autofunc(const auto&a)
{
库特
而不是:

template<class T, class R>
R func(const T& a);
又名为为字符串创建一个临时变量并将其传递给..或将参数强制转换为指向字符数组的指针。似乎很难判断它是“const char[15]”还是“const char*”

无论哪种方式,上述方法都会奏效

而不是:

template<class T, class R>
R func(const T& a);
又名为为字符串创建一个临时变量并将其传递给..或将参数强制转换为指向字符数组的指针。似乎很难判断它是“const char[15]”还是“const char*”

无论哪种方式,上述方法都会起作用。

这是一个GCC错误

C++14中的函数参数声明中不允许使用
auto
。此语法是由Concepts Lite TS添加的

G++支持§4.1.2规定的无约束通用函数 以及N3889的§5.1.1:概念精简规范。简而言之,
auto
may 在任何函数的参数声明中用作类型说明符 声明器,以引入隐式函数模板 参数,类似于通用lambda

N3889是概念TS的早期工作草案。引用的第5.1.1节的第

泛型函数由具有
auto
或 概念名称,作为其名称中类型说明符的一部分 参数声明子句。[示例:

-[结束示例]

在中使用
auto
或概念名称 参数声明条款应解释为使用具有相同约束和命名概念的类型参数。[注:未指定实现此目的的确切机制。-结束 注][示例:下面声明的泛型函数

auto f(auto x, const Regular& y);
等同于以下声明

template<typename T1, Regular T2>
auto f(T1 x, const T2&);
这本应该是有效的。相反,它被解释为

template<class T>
T autofunc( const T& a) { /* ... */ }
这是一个GCC错误

C++14中的函数参数声明中不允许使用
auto
。此语法是由Concepts Lite TS添加的

G++支持§4.1.2规定的无约束通用函数 以及N3889的§5.1.1:概念精简规范。简而言之,
auto
may 在任何函数的参数声明中用作类型说明符 声明器,以引入隐式函数模板 参数,类似于泛型lambdas

N3889是概念TS的早期工作草案。引用的第5.1.1节的第

泛型函数由具有
auto
或 概念名称,作为其名称中类型说明符的一部分 参数声明子句。[示例:

-[结束示例]

在中使用
auto
或概念名称 参数声明条款应解释为使用具有相同约束和命名概念的类型参数。[注:未指定实现此目的的确切机制。-结束 注][示例:下面声明的泛型函数

auto f(auto x, const Regular& y);
等同于以下声明

template<typename T1, Regular T2>
auto f(T1 x, const T2&);
这本应该是有效的。相反,它被解释为

template<class T>
T autofunc( const T& a) { /* ... */ }

它在GCC 4.9上。

什么是
functor
?什么是
f
?确切的问题/错误消息是什么?你使用的是什么版本的编译器?@ildjarn,哦,对不起。functor是不必要的对象,我忘了删除它。我使用的编译器是G++-4.9。错误消息是我添加到问题中的。你不允许使用
auto
在函数参数声明中。
decltype(auto)autofunc(const auto&a){…}
在C++14中无效。@T.C.我认为你是对的。但为什么编译器不阻止这样的声明并用传递的其他类型编译它是一个问题。顺便说一句:调用lambda的lambda(其参数具有自动类型推断)已编译…
std::forward
仅对
T&
(或
auto&
)有用参数,不是
const T&
。什么是
functor
?什么是
f
?确切的问题/错误消息是什么?你使用的是什么版本的编译器?@ildjarn,哦,对不起。functor是不必要的对象,我忘了删除它。我使用的编译器是G++-4.9。错误消息我添加到了问题中。你不允许使用它函数参数声明中的
auto
decltype(auto)autofunc(const auto&a){…}
是无效的C++14。@T.C.我想你是对的。但为什么编译器不阻止这样的声明,并用传递的其他类型编译它是一个问题。顺便说一句:调用lambda的lambda(对其参数使用自动类型推断)进行编译…
std::forward
仅对
T&
(或
auto&
)有用参数,而不是
const T&
。仍然不清楚为什么这个beavour只涉及数组,因为只有当我传递数组时,函数才会以这种方式运行。在另一种情况下,它会被编译…是的,只要您将auto更改为auto(无论在何处将此更改应用于func或lambd)它编译得很好,工作正常。只需将参数转换为指向char数组的指针作为解决方法。。或者为字符串创建一个临时变量,并将该变量作为参数传递。因此,结论是,普通函数参数的自动类型推断不是standart的一部分,也不是g++的行为方式(允许为除数组之外的所有类型编译代码)是g++的一个bug。现在还不清楚为什么这个beavour只涉及数组,因为只有当我传递数组时,函数才会以这种方式运行。在其他情况下,它会被编译…是的,只要您将auto更改为auto(无论在何处将此更改应用于eit)
template<typename T1, Regular T2>
auto f(T1 x, const T2&);
template<class T>
decltype(auto) autofunc( const T& a) { /* ... */ }
template<class T>
T autofunc( const T& a) { /* ... */ }
// the following two function declarations are equivalent
auto incr(auto x) { return x++; }
template <typename T>
auto incr(T x) { return x++; }