Xét đoạn mã sau:Loại chuyển đổi ở mẫu phi kiểu lập luận mà không constexpr
struct A {
constexpr operator int() { return 42; }
};
template <int>
void foo() {}
void bar(A a) {
foo<a>();
}
int main() {
foo<A{}>();
const int i = 42;
foo<i>(); // (1)
A a{};
static_assert(i == a, "");
bar(a);
foo<a>(); // error here
}
Clang 3.7 với C++ 14 chấp nhận này, trong khi gcc 5.2.0 với C++ 14 không, sản xuất thông báo sau:
/tmp/gcc-explorer-compiler1151027-68-1f801jf/example.cpp: In function 'int main()': 26 : error: the value of 'a' is not usable in a constant expression foo<a>(); ^ 23 : note: 'a' was not declared 'constexpr' A a{}; ^ Compilation failed
Thay đổi a
là constexpr
theo đề nghị của gcc sửa chữa các lỗi biên dịch gcc, nhưng không constexpr
, mà compi ler là đúng?
Đối với tôi, có vẻ như a
phải là "có thể sử dụng được trong biểu thức liên tục", như là static_assert
ceritifies. Hơn nữa, thực tế là i
có thể được sử dụng theo cùng một cách (được đánh dấu (1)
) và thực tế là biên dịch bar()
, cũng khiến tôi nghĩ rằng gcc là sai.
UPD: Báo cáo một lỗi đối với gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68588
thay đổi 'const' bởi 'công trình constexpr' [ Demo] (http://coliru.stacked-crooked.com/a/1bc480f2de523b5e). – Jarod42
@ Jarod42, vâng, hãy xem bản chỉnh sửa của tôi. – Petr