首页 > 解决方案 > 为什么要在 std::initializer_list 中编译关于函数模板专业化的注释?

问题描述

我使用以下方法编写了一个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]

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

标签: c++stdcompiler-warnings

解决方案


将 initializer_list 转换为 void 以显示编译器您不是故意使用它


推荐阅读