【发布时间】:2013-04-06 15:57:30
【问题描述】:
从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()) 部分必须只找出函数的返回类型是什么,它不应该关心函数是否修改了作为参数传递的对象!
【问题讨论】:
-
每个问题一个问题。停止尝试抵消 SO 的机制(“奖励问题 - 奖励 +1 答案”wtf)