C++11 - 清除返回值语法和 decltype 关键字

标签 c++ c++11

here 读取,这段 C++11 代码对我来说似乎很奇怪:

template <typename Builder>
auto
makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
{
    auto val = builder.makeObject();
    // do stuff with val
    return val;
}

我有几个问题:

1) decltype(builder.makeObject()) 是否在执行实际调用之前额外调用一次 makeObject 函数?

2) 如果不是并且在编译时一切都已知(所以它是一种增强的宏),为什么以下语法无效而我需要新的返回值语法?

//WRONG    
template <typename Builder>
    decltype( builder.makeObject() )
    makeAndProcessObject (const Builder& builder)
    {
        auto val = builder.makeObject();
        // do stuff with val
        return val;
    }

[奖励问题 - 对答案给予 +1 奖励] 3)在this一个人问为什么他的代码没有编译,答案是成员函数 makeObject 缺少“const”说明符。我得到了答案,但不知道为什么需要 const。

什么给出了以下声明

template <typename Builder>
auto
makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )

如果 const Builder& 对象引用具有 const makeObject 或非 const makeObject? decltype(builder.makeObject()) 部分必须只找出函数的返回类型是什么,它不应该关心函数是否修改作为参数传递的对象!

最佳答案

一般而言,C++ 中的事物在声明之后才可用。在您的示例中,您尝试在构建器被声明之前使用它:

template <typename Builder>
    decltype( builder.makeObject() ) // using builder here
    makeAndProcessObject (const Builder& builder) // but builder isn't declared until here
    {
        auto val = builder.makeObject();
        // do stuff with val
        return val;
    }

添加了函数返回类型的新语法来解决这个问题。

template <typename Builder>
auto // dummy return type, meaning we will give it later
makeAndProcessObject (const Builder& builder)  // declaring builder here
-> decltype( builder.makeObject() ) // using builder here -- no problem.
{
    auto val = builder.makeObject();
    // do stuff with val
    return val;
}

至于你的额外问题:对于语言来说,你必须给 decltype 一个有效的表达式,而不是有另一组关于哪些参数对 decltype 有效的规则,这要简单得多。

关于C++11 - 清除返回值语法和 decltype 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852922/

相关文章:

c++ - C++ 中的浮点加法是否可能发生下溢?

c++ - SIMD 值的合理散列?

c++ - 为什么 std::boolalpha 在使用 clang 时忽略字段宽度?

c++ - C++ 数组运算符和 *(array + index)(如果有)有什么区别?

c++ - 函数返回如何返回特定计数

c++ - Clang、std::shared_ptr 和 std::less/operator<

c++ - MFC:如何更改整个编辑框的背景颜色?

c++ - 有没有办法让捕获在正则表达式中重复任意次数?

c++ - 使用 extern 的显式实例化声明

c++ - 复制算法与容器构造函数