Можно ли вызвать шаблонный пользовательский оператор преобразования с явными аргументами шаблона? - PullRequest
2 голосов
/ 21 марта 2019

Давайте рассмотрим следующий код (успешно компилируется с clang ++ 7.0.0 , аргументы компилятора -std=c++17 -Wall -Wextra -Werror -pedantic-errors):

#include <iostream>


struct Foo
{
    template <typename Type = void>
    operator int()
    {
        return 42;
    }
};


int main()
{
    const auto i = Foo{}.operator int();

    std::cout << i << std::endl;
}

Можно ли вызывать такой шаблонный пользовательскийоператор преобразования с явно предоставленными аргументами шаблона?Наивный подход не компилируется:

const auto i = Foo{}.operator int<bool>();

Ответы [ 2 ]

5 голосов
/ 21 марта 2019

[temp.names] (Названия шаблонных специализаций) / 1 :

На специализацию шаблона может ссылаться template-id :

simple-template-id:
    template-name < template-argument-listₒₚₜ >

template-id:
    simple-template-id
    operator-function-id < template-argument-listₒₚₜ >
    literal-operator-id < template-argument-listₒₚₜ >

template-name:
    identifier

Как видите, 1014 * conversion-function-id: operator conversion-type-id , упомянутый в шаблоне , не указан в идентификаторе шаблона *1017*. грамматика.

0 голосов
/ 21 марта 2019

Я понимаю, что этот вопрос относится к расширенным сценариям и задает вопрос, соответствует ли код стандарту, но давайте на секунду вернемся назад:

Оператор преобразования предназначен для определения "статического приведения"."операция"Не имеет смысла делать статическое приведение зависимым от другого шаблонного типа

...