Hàm test
bên dưới được nạp chồng cho các chuỗi trống giá trị, chuỗi không rỗng giá trị và chuỗi giá trị. Tôi đã cố gắng biên dịch với Clang và GCC nhưng trong cả hai trường hợp, tôi không có kết quả như mong đợi.
#include <iostream>
void test(const char (&)[1]){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
template <unsigned long int N>
void test(const char (&)[N]){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
void test(char*&&){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
int main(){
char str1[] = "";
char str2[] = "test";
test("");
test("test");
test(str1);
test(str2);
}
Đầu ra với phiên bản clang 6.0.0-1ubuntu2 :
clang++ test.cpp -o test.out && ./test.out
void test(const char (&)[1])
void test(const char (&)[N]) [N = 5]
void test(char *&&)
void test(char *&&)
Đầu ra với g ++ (MinGW.org GCC-8.2.0-3) :
g++ test.cpp -o test.exe && test.exe
test.cpp: In function 'int main()':
test.cpp:15:11: error: call of overloaded 'test(char [1])' is ambiguous
test(str1);
^
test.cpp:3:6: note: candidate: 'void test(const char (&)[1])'
void test(const char (&)[1]){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
^~~~
test.cpp:6:6: note: candidate: 'void test(const char (&)[N]) [with long unsigned int N = 1]'
void test(const char (&)[N]){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
^~~~
test.cpp:8:6: note: candidate: 'void test(char*&&)'
void test(char*&&){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
^~~~
Câu hỏi của tôi là:
- Trình biên dịch nào là chính xác?
- Với Clang, tại sao
test(str1)
vàtest(str2)
chọn quá tải giá trị trong khi chúng là giá trị? - Với GCC, tại sao cách gọi lại
test(str1)
mơ hồ? - Có một quy tắc tiêu chuẩn nào cho tình huống này không?
- Làm thế nào để khắc phục hai cuộc gọi cuối cùng?
Cảm ơn bạn.