cuốn sách gpt4 ai đã làm

Tại sao mã được clang chấp nhận nhưng bị vc++ từ chối?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:24:13 28 4
mua khóa gpt4 Nike

clang 3.4 chấp nhận mã sau đây trong khi vc++ NOV 2013 CTP từ chối mã đó do lỗi:

lỗi C2668: 'AreEqual': lệnh gọi không rõ ràng đến hàm quá tải
mẫu
constexpr headT&& __GetFirst__(headT&& value, tailTypes&&...)
{
trả về static_cast(value);
};

mẫu
constexpr bool AreEqual(const T& a, const T& b)
{
trả về a == b;
}

mẫu
constexpr bool AreEqual(const headT& head_value, const tailTypes&... tail_values)
{
trả về AreEqual(head_value, __GetFirst__(tail_values...))
&& AreEqual(tail_values...);
}

int main()
{
AreEqual(1, 1, 2, 1);
}

Trình biên dịch nào đúng theo tiêu chuẩn C++ 14?

Cập nhật: Thông báo lỗi đầy đủ:

lỗi C2668: 'AreEqual': lệnh gọi không rõ ràng đến hàm quá tải
1> d:\projects\ktl\test\main.cpp(20): có thể là 'bool AreEqual(const headT &,const int &)'
1> với
1>[
1> đầuT=int
1> ]
1> d:\projects\ktl\test\main.cpp(8): hoặc 'bool AreEqual(const T &,const T &)'
1> với
1>[
1> đầuT=int
1> , T=int
1> ]
1> trong khi cố gắng khớp danh sách đối số '(const int, const int)'
1>
1>Bản dựng THẤT BẠI.

câu trả lời hay nhất

Hành vi của Clang (và GCC) là chính xác. Bạn có thể đọc §14.8.2.4 [temp.deduct.partial] của tiêu chuẩn để xem cách thực hiện việc sắp xếp một phần các mẫu hàm, nhưng ví dụ được đưa ra trong p8 của mệnh đề phụ đó sẽ đề cập trực tiếp đến trường hợp này:

template void f(Args... args); // #1
template void f(T1 a1, Args... args);
mẫu void f(T1 a1, T2 a2); // #3
f(); // gọi số 1
f(1, 2, 3); // gọi số 2
f(1, 2); // gọi mẫu số 3;
// chuyên biệt hơn các mẫu variadic #1 và #2

Giới thiệu về c++ - Tại sao mã được clang chấp nhận nhưng bị vc++ từ chối? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/24710542/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress