下面的c++程序没有编译,并且显示了各种错误

the following c++ program does not compile and is displaying a variety of errors

本文关键字:显示 错误 编译 c++ 程序      更新时间:2023-10-16

所以我读到了关于auto和其他C++11标准特性的文章,并制作了这个程序:

#include<iostream>
#include<tuple>
using namespace std;
template<typename T1, typename T2>
auto create_pair(const T1 &a, const T2 &b)
{
    pair<T1, T2> p(a, b);
    return p;
}
int main()
{
    auto p1 = create_pair(4, 5.6);
    pair<int, float> p(p1);
    cout << get<0>(p);
    cout << endl;
    cout << get<1>(p);
    return 0;
}

我的问题是,auto是否可以按照create_pair()函数中规定的方式使用,或者是否存在其他变通方法来实现相同的结果。

使用gcc编译时的错误消息如下:

create_pair函数使用不带返回类型的自动类型说明符。

自动返回类型推导是C++14的一个特性,如果使用C++14编译,您的代码就会工作。返回类型位置中的auto关键字是C++11尾部返回类型功能的一部分,在该功能中,您可以在正文前面用箭头和类型(例如auto foo() -> int {...})指定返回类型。

如果没有宏,在C++11中,最接近的是一个以单个语句(返回语句)为主体的lambda函数,这在模板中不起作用,并且可能会导致函数作为变量而不是函数的轻微问题。

使用宏,您可以获得auto foo() RETURNS(2)的效果,它将扩展到auto foo() -> decltype(2) {return 2;}

顺便说一句,这个功能已经存在;它是std::make_pair,它的实现比您的版本更有用。

错误消息完全描述了发生了什么。在C++11中,auto代替函数返回类型不是返回类型推导,而是实际指定返回类型的一种替代方法,应该这样使用:

template<typename T1, typename T2>
auto create_pair(const T1 &a, const T2 &b) -> std::pair<T1, T2>;

它旨在用于等环境

template <typename T1, typename T2>
auto add (T1 const & x1, T1 const & x2) -> decltype(x1 + x2)
{
    return x1 + x2;
}

而不是更丑陋的

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>()) add (T1 const & x1, T1 const & x2)
{
    return x1 + x2;
}

在C++11中,返回类型扣除仅适用于lambdas:

auto create_pair = [](int x, int y){ return std::pair<int, int>(x, y); }

由于您的函数是一个模板(允许模板化的通用lambda也是C++14的特性),所以这不会有多大帮助。

然而,您的代码应该在C++14下编译,因为后者带来了与您在代码中使用的语法完全相同的返回类型推导。