【发布时间】:2017-03-13 15:25:22
【问题描述】:
我有这样的功能
template<typename T>
const T& get(std::string key, T defaultValue)
{
try {
return getFromMap<T>(key);
}
catch (const std::exception &e)
{
return defaultValue;
}
}
它从混合类型映射中检索类型化的值,如果找不到键,则返回 defaultValue。映射中有原始类型和对象类型作为值(因此我们必须返回对该值的引用)。我们只需要担心原始的 defaultValues;不支持将它与我们的对象值一起使用。此函数在 linux 上运行良好,但是在 Windows 上运行时,我返回的 defaultValues 是垃圾。例如,
get("missing", true) 返回 false(即 0)
get("missing", 3.14) 返回 0
get("missing", "myDefault") 返回垃圾地址
等等。我猜这个问题类似于 defaultValue 被复制到函数内部的一个新变量中,然后返回对临时的引用。如何修复我的功能以在 Windows 上执行正确的操作?
【问题讨论】:
-
你可以按值返回。复制省略将使其最佳化。
-
如果你只有“原始值”(我假设像
int或double),那么总是按值传递和返回。根本不需要参考。 -
经验法则:永远不要返回对非静态局部变量或非引用函数参数的引用。
-
获取前去掉'&'