从这里阅读,这个 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) 在这个问题中,一个人问为什么他的代码没有编译,答案是成员函数 makeObject 缺少“const”说明符。我得到了答案,但不知道为什么需要 const。
什么给了以下声明
template <typename Builder>
auto
makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
如果 const Builder& 对象引用具有 const makeObject 或非 const makeObject?decltype(builder.makeObject()) 部分必须只找出函数的返回类型是什么,它不应该关心函数是否修改了作为参数传递的对象!