Зачем компилировать в std :: initializer_list записку о специализации шаблона функции? - PullRequest
2 голосов
/ 11 июля 2019

Я написал printf функцию, используя std::initializer_list:

template<typename T, typename... Ts>
auto printf(T t, Ts... args) {
    std::cout << t << std::endl;
    return std::initializer_list<T>{([&] {
        std::cout << args << std::endl;
    }(), t)...};
}

int main() {
    printf(111, 123, "alpha", 1.2);
    return 0;
}

Компилятор делает заметку об экземпляре специализации шаблона функции:

warning: returning address of local temporary object [-Wreturn-stack-address]
    return std::initializer_list<T>{([&] {
                                   ^~~~~~~
note: in instantiation of function template specialization 'printf<int, int, const char *, double>' requested here
    printf(111, 123, "alpha", 1.2); 

Я знаю о возврате стекаадрес - плохая практика, однако, если я не верну, то получу:

warning: expression result unused [-Wunused-value]

Как я могу изменить свой код, чтобы избежать этих трех типов предупреждений компилятора?

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Приведите initializer_list к void, чтобы показать компилятору, что вы не используете его намеренно

1 голос
/ 11 июля 2019

Как я могу изменить свой код, чтобы избежать этих трех типов предупреждений компилятора?

Не возвращайте объект и используйте старый добрый (void) -трюк (см., Например, этот поток для получения дополнительной информации об этом):

(void) std::initializer_list<T>{ /* ... */ };

Кстати, довольно крутая printf реализация:)

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