Đoạn mã sau đây đã được biên dịch thành công với gcc 5.3.0 nhưng không biên dịch được bằng clang 3.7.0. Tôi đã sử dụng các trình biên dịch coliru trực tuyến với các tùy chọn dòng lệnh giống nhau trong cả hai trường hợp: -std = C++ 14 -O2 -Wall -pedantic -pthread.Đối số chỉ được sử dụng trong ngữ cảnh không được đánh giá bên trong nội dung của hàm constexpr
#include <cstdio>
// Definition of constexpr function 'foo'.
constexpr std::size_t foo(const int& arg_foo) { return sizeof(arg_foo); }
// Definition of function 'test'.
void test(const int& arg)
{
// The following line produces an error with clang.
constexpr std::size_t res_foo = foo(arg);
// Print the result returned by the 'foo' function.
std::printf("res_foo = %lu\n", res_foo);
}
// Definition of function 'main'.
int main(int argc, const char* argv[])
{
// Test function call.
test(argc);
// Return statement.
return 0;
}
kêu vang từ chối yêu cầu với các lỗi sau:
error: constexpr variable 'res_foo' must be initialized by a constant expression
constexpr size_t res_foo = foo(arg);
~~~~^~~~
Bởi vì sự khác biệt này giữa hai trình biên dịch, tôi tự hỏi nếu điều này là một phần giá trị của mã. Nếu không, tôi muốn hiểu rõ hơn về lý do tại sao điều này xảy ra.
lỗi gcc, một trong nhiều khi nói đến constexpr – TemplateRex
@TemplateRex Nhưng theo cách nào thì 'foo' vi phạm bất kỳ quy tắc nào của hàm constexpr? – Archimaredes
@Archimaredes không, lỗi là 'arg' trong' test' không phải là 'constexpr' – TemplateRex