Tôi gặp vấn đề tương tự với this một vấn đề.Sự không thống nhất với tình trạng noexcept và quá tải có điều kiện
Tóm lại, tôi có phương thức magic
, là noexcept
nếu phương pháp khác là noexcept
.
Điều kỳ lạ là "phương pháp khác" này có hai lần quá tải và trình biên dịch chọn quá tải giây thứ hai để xác định magic
noexcept
-ness.
Tuy nhiên, khi magic
được gọi sau này, các quá tải đầu tiên được gọi, nhưng noexcept
-ness của magic
vẫn giữ nguyên!
Đây là wandbox link
Từ những gì tôi hiểu:
noexcept(magic(dummy2{}))
cuộc gọinoexcept(noexcept(adl_caller(...))
mà rơi trở lạiadl_caller(..., priority_tag<0>) noexcept
từuser_method(dummy2)
không biết đến bởi trình biên dịch vào thời điểm này.
Đủ công bằng, tuy nhiên, cách user_method(dummy2)
được gọi là 3 dòng ở trên? Đây có phải là tiêu chuẩn của tiêu chuẩn không?
Xin lỗi nếu tôi không đủ rõ ràng.
#include <iostream>
template <unsigned N> struct priority_tag : priority_tag<N - 1> {};
template <> struct priority_tag<0> {};
template <typename T>
auto adl_caller(T t, priority_tag<1>) noexcept(noexcept(user_method(t)))
-> decltype(user_method(t)) {
std::cout << "first adl_caller overload" << std::endl;
user_method(t);
}
// tricky noexcept ...
template <typename T> void adl_caller(T, priority_tag<0>) noexcept {
std::cout << "second adl_caller overload" << std::endl;
}
template <typename T>
void magic(T t) noexcept(noexcept(adl_caller(t, priority_tag<1>{}))) {
adl_caller(t, priority_tag<1>{});
}
struct dummy {};
struct dummy2 {};
// un-commenting this line makes the above call to cout print '0'
// void user_method(dummy2);
void user_method(dummy)
{
// user_method(dummy2) is declared after this point
// this line prints '1', since magic falls back to the second adl_caller overload
std::cout << "noexcept?: " << noexcept(magic(dummy2{})) << std::endl;
std::cout << "dummy method called" << std::endl;
// however, the first adl_caller overload is called here ...
magic(dummy2{});
}
void user_method(dummy2)
{
std::cout << "dummy2 method called" << std::endl;
}
int main()
{
magic(dummy{});
}
Tôi nghĩ rằng tôi hiểu một số phần của các đoạn văn đó, nhưng chúng hơi quá tối nghĩa với tôi. Tôi chỉ có một TU và không có hàm liên kết bên ngoài trong ví dụ của tôi, đoạn cuối cùng liên quan đến mã tôi đã liên kết như thế nào? Nếu tôi hiểu chính xác, phương pháp 'ma thuật' được liên kết với đoạn đầu tiên, nhưng tôi có một số rắc rối khi nắm được lý do chính xác. Cảm ơn rất nhiều cho các trích đoạn tiêu chuẩn mặc dù – Dante