Tôi đã gặp khó khăn với vấn đề biên dịch và có thể thu hẹp sự cố xuống một đoạn mã nhỏ.Hành vi đặc biệt đối với người khai thác cuộc gọi đối với các loại không đầy đủ
Để đặt giai đoạn, tôi đang cố gắng thực hiện CRTP, trong đó phương thức cơ sở gọi một phương thức khác trong lớp dẫn xuất. Biến chứng là, tôi muốn sử dụng các kiểu trả về theo sau để có được kiểu chuyển tiếp trực tiếp đến phương thức của lớp Derived. Điều này luôn không thể biên dịch trừ khi Tôi chuyển tiếp đến toán tử cuộc gọi trong lớp dẫn xuất.
này biên dịch:
#include <utility>
struct Incomplete;
template <typename Blah>
struct Base
{
template <typename... Args>
auto entry(Args&&... args)
-> decltype(std::declval<Blah&>()(std::declval<Args&&>()...));
};
void example()
{
Base<Incomplete> derived;
}
Trong khi điều này không: (lưu ý Viết bình luận cho sự khác biệt duy)
#include <utility>
struct Incomplete;
template <typename Blah>
struct Base
{
template <typename... Args>
auto entry(Args&&... args)
-> decltype(std::declval<Blah&>().operator()(std::declval<Args&&>()...));
// I only added this ^^^^^^^^^^^
};
void example()
{
Base<Incomplete> derived;
}
Các lỗi tôi nhận được:
<source>: In instantiation of 'struct Base<Incomplete>':
15 : <source>:15:22: required from here
10 : <source>:10:58: error: invalid use of incomplete type 'struct Incomplete'
-> decltype(std::declval<Blah&>().operator()(std::declval<Args&&>()...));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Có vẻ là một số hành vi đặc biệt xảy ra trong khi giải quyết các decltype trong lớp Derived. Có cái gì đó trong tiêu chuẩn sẽ giải thích điều này?
EDIT: Đã thực hiện một việc đơn giản hóa thậm chí lớn hơn
PS: biên soạn dụ trên godbolt: https://godbolt.org/g/St2gYC
Tại sao bạn không viết 'std :: declval()'? Tôi đoán rằng khối thứ hai là một sử dụng odr của 'Incomplete' trong khi lần đầu tiên là không. –
@PasserBy Dù bằng cách nào, đó cũng là vấn đề tương tự. Tôi đã thay đổi nó thành gợi ý của bạn để có ít nhầm lẫn hơn. –
Bạn đang tìm kiếm điều này có thể? https://stackoverflow.com/questions/7943525/is-it-possible-to-figure-out-the-parameter-type-and-return-type-of-a-lambda –