Với this test program:Tại sao "cuộc gọi" này lại khẳng định khi thấy hai đối số thay vì chỉ là một đối số?
#include <cassert>
#include <string>
#include <type_traits>
const std::string& const_string = "bla";
std::string const & string_const = "blabla";
static_assert(std::is_same<decltype(const_string), decltype(string_const)>::value, "Uhoh");
int main()
{
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
}
nào khẳng định rằng hai loại đều giống nhau ở thời gian biên dịch và khi chạy bằng assert C. Tất cả các Clang, MSVC2015, và GCC báo lỗi tương tự, vì vậy tôi khá chắc chắn it's me:
main.cpp:13:49: error: too many arguments provided to function-like macro invocation
assert(std::is_same<decltype(const_string), decltype(string_const)>::value);
^
/usr/include/assert.h:91:10: note: macro 'assert' defined here
# define assert(expr) \
^
Tôi chỉ không nhìn thấy hai đối số trong assert
. Hơn nữa, các static_assert
hoạt động tốt ... Vì vậy, những gì đang xảy ra ở đây?
Tôi tin rằng bộ tiền xử lý nhìn thấy hai "so sánh"; 'std :: is_same :: giá trị'. Không có cách nào để người tiền xử lý nói rằng họ không có. –
molbdnilo
** static_assert ** là từ khóa, ** khẳng định ** macro tiền xử lý. Các macro tiền xử lý phân tách các đối số bằng ',' theo cách không thông minh. Các dấu ngoặc bổ sung ngăn chặn điều này. – Youka