gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:46:30 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com