【发布时间】:2019-05-03 09:12:13
【问题描述】:
template<class A, class B> constexpr int f(A a, B b) {
a /= b;
return a;
}
constexpr int x = f(2, 2); // a, b: int
constexpr int y = f(2., 2.); // a, b: double
constexpr int z = f(2, 2.); // a: int, b: double //<-- BOOM!
constexpr int w = f(2., 2); // a: double, b: int
int main() {}
代码未在 clang 中编译,它会产生以下诊断信息:
error: constexpr variable 'z' must be initialized by a constant expression
MSVC 崩溃(根据godbolt)并且 gcc 工作正常。如果a /= b 被a = a / b 简单替换,那么每个人都接受它。为什么?
谁是对的?似乎它与隐式缩小转换有关,但为什么a = a / b 有效?
【问题讨论】:
-
一定是clang的bug,
a /= b应该等价于a = a / b。 -
我建议问问 Richard Smith,他在 clang 中实现了 constexpr 评估器。在我看来,他在实施这部分时有一个疏忽(这是罕见的!)。
标签: c++ language-lawyer constexpr