Конструктор с выводом аргумента шаблона выполняется неожиданно - PullRequest
0 голосов
/ 01 апреля 2019

Проблема

Вызванный конструктор (т. Е. A::A(T)) не выполняется должным образом.Вызов его компилируется (с использованием GCC-8.3.0), но, похоже, не выполняет std::cout operator<<.Почему это так?

Код

struct A {

    template <typename T>
    constexpr A(T) {
        std::cout << "A::A(T)";
    }
};

struct B {};

int main() {
    ::A a (B());
}

Почему вы вообще это делаете?

Я пытаюсьвыводим тип T - шаблонный аргумент .Объект не имеет значения и поэтому не назван.Мне требуется тип T для доступа к определенным данным во время компиляции (среди прочего для static_assert).Насколько я знаю, в C ++ невозможно явно указать аргумент шаблона в качестве параметра конструктора.(Итак: A a = A::A<T>).Я мог бы сделать это косвенным путем, то есть создать статическую функцию-член для создания, где можно указать параметр:

struct C {
    template <typename T>
    static constexpr C create() { 
        // do whatever you want with T
        return C(); 
    }
};

Однако я в основном просто экспериментирую.

1 Ответ

2 голосов
/ 01 апреля 2019

Вы столкнулись с самым неприятным анализом . Вы должны определить a следующим образом:

::A a {B{}};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...