【发布时间】:2021-09-23 08:52:13
【问题描述】:
考虑一下这个sn-p:
#include <stdexcept>
template <typename T> class MyClass;
template <typename T> struct MyClass<T &> {
constexpr T &foo() && {
return value != nullptr ? std::move(*value)
: throw std::runtime_error("foo");
}
constexpr decltype(auto) bar() && {
return value != nullptr ? std::move(*value)
: throw std::runtime_error("bar");
}
T *value;
};
int main() {
const int &good = MyClass<int &>{}.bar();
const int &bad = MyClass<int &>{}.foo();
}
为什么方法 bar 中的返回规范 decltype(auto) 有效,而 foo 中的 T& 无效?
【问题讨论】:
-
谁说这是在演绎
T&?如果是这样,您不认为main中的非常量引用会起作用吗? -
更好地描述症状,而不仅仅是您的解释。错误信息应包含在问题中
-
@molbdnilo - 不,它推断出
T&&。 -
旁注:在这种情况下,我只会使用标准的保护子句,而不是试图用三元语句来破坏可读性
标签: c++ templates type-inference decltype decltype-auto