【发布时间】:2017-05-16 06:21:37
【问题描述】:
我们来看一个模板类:
template<typename T>
class A{};
还有一个辅助函数,通过类型推导实例化 A:
template<typename T>
constexpr A<T> makeA(T)
{
return A<T>();
}
最后是运行时值,但其类型 (int) 在编译时是已知的:
int i = //... retrieving a runtime value;
以下内容无法编译,虽然它只使用了 i 的类型,而不是它的值:
constexpr auto a = makeA(i);
错误是:'i' 的值不能用于常量表达式。
我知道i 不能被传递,因为它的值在编译时是未知的,但另一方面makeA 完全丢弃了这个值。
那么我怎样才能实例化一个以 i 类型为模板的 constexpr A,而不必拼出 A<int> 或 A<decltype(i)>?
我想一定有办法,因为所有信息在编译时都可用。
【问题讨论】:
-
@πάνταῥεῖ:问题说明了这一点。
-
为什么不 makeA()?
-
你还有
decltype(makeA(i))。 -
常量表达式只能包含(计算的)常量子表达式。这是一个简单的规则,很容易在编译器中实现。原则上可以定义(更)更复杂的规则,但故意不这样做(并且
decltype作为内置语言原语被专门引入以从非常量表达式中提取类型)。所以答案是否定的。