了解模板与自动功能之间的decltype(auto)差异

时间:2019-01-06 13:52:53

标签: c++ templates c++14 auto decltype

我需要帮助来理解为什么在下面提供的代码中updateElementUsingTemplate的返回类型与updateElementUsingAuto有所不同。

#include <iostream>
#include <array>
#include <vector>
#include <boost/type_index.hpp>
using boost::typeindex::type_id_with_cvr;

template<typename Container, typename Index>
decltype(auto) updateElementUsingTemplate(Container&& container, Index index)
{    
    std::cout << "Template Return Type : "<<
    type_id_with_cvr<decltype( container[index] )>().pretty_name() << '\n';
    return container[index];
}

decltype(auto) updateElementUsingAuto(auto&& container, size_t index)
{
    std::cout << "Auto Return Type : "<<
    type_id_with_cvr<decltype( container[index] )>().pretty_name() << '\n';
    return container[index];
}

int main() {
    std::array<int,2> arr= {1,2};
    updateElementUsingTemplate( arr, 1 ) = 12;
    updateElementUsingAuto( arr, 1 );// = 12;
    //Generates compiler error if uncommented: lvalue required as left operand of assignment.
    //Why is type being returned "int" in above statement?
    std::cout << "Auto Returned Type : "<< 
type_id_with_cvr<decltype( updateElementUsingAuto(arr,1) )>().pretty_name() << '\n';
    std::cout << "Template Returned Type : "<<
type_id_with_cvr<decltype( updateElementUsingTemplate(arr,1) )>().pretty_name() << '\n';
    return 0;
}

实际结果:
模板返回类型:int&
自动返回类型:int&
自动返回的类型:int
返回的模板类型:int&

预期结果:
模板返回类型:int&
自动返回类型:int&
自动返回的类型:int&
返回的模板类型:int&

我期望updateElementUsingAuto和updateElementUsingTemplate都返回int&,而实际返回的结果分别是int和int&。
为什么两个函数的返回类型都不同?

我们将非常感谢您的帮助。

编辑1:如@cpplearner所述,此问题似乎是gcc错误。
如果仍然有人想要使用该语法,则可以使用尾随类型的语法:
    decltype(auto)updateElementUsingAuto(auto && container,size_t index)-> decltype(container [index]){...}

0 个答案:

没有答案