为什么要在std :: initializer_list中编译有关函数模板特化的注释?

时间:2019-07-11 09:00:33

标签: c++ std compiler-warnings

我使用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 个答案:

答案 0 :(得分:2)

将initializer_list声明为空,以表明您没有故意使用编译器

答案 1 :(得分:1)

  

如何更改代码以避免这三种类型的编译器警告?

不要返回对象,而要使用古老的(void)技巧(有关更多信息,请参见this thread):

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

顺便说一句,非常棒的printf实现:)