Руководство по дедукции C++17, определенное внутри класса, неэффективно внутри этого класса, но полезно вне класса

#include <variant>

struct A { };

struct B { };

struct Test
{
    template<typename Ts>
    struct overloaded : Ts { };

    // 1st Deduction Guide
    template<typename Ts>
    overloaded(Ts)->overloaded<Ts>;

    // 2nd Deduction Guide for class "A"
    overloaded(A)->overloaded<A>;

    void Fun()
    {
        // OK
        overloaded obj1{ A{} };

        // Error: No instance of constructor matches the argument list
        // I think the 1st Deduction Guide is not effective inside class "Test"
        overloaded obj2{ B{} };
    }
};

int main()
{
    // All Deduction Guides in class "Test" are effective here

    // OK
    Test::overloaded obj1{ A{} };

    // OK
    Test::overloaded obj2{ B{} };

    return 0;
}

Я определил некоторые C++17 Руководства по вычету внутри класса под названием Test.

Но я обнаружил, что первое руководство по дедукции, которое включает аргумент шаблона Ts неэффективен внутри класса Testсам. Но эффективен вне его, например, в main функция.

template<typename Ts>
overloaded(Ts)->overloaded<Ts>;

2-е руководство по вычету, которое не включает аргумент шаблона, эффективно как внутри, так и вне класса.

overloaded(A)->overloaded<A>;

Кто-нибудь может сказать мне, почему?

Моя IDE Visual Studio 2019, стандарт C++ C++17.

Спасибо.

0 ответов

Другие вопросы по тегам