禁止显示警告“逗号运算符的左操作数不起作用”[重复]

suppress warning "left operand of comma operator has no effect" [duplicate]

提问人:francesco 提问时间:10/4/2023 更新时间:10/4/2023 访问量:60

问:

在下面的代码中,使用折叠表达式创建具有重复元素的数组:

#include <array>
#include <utility>

template <std::size_t N>
class A {
    int m_x;

public:
    static constexpr std::size_t size = N;

    A(int x) : m_x{x} { }
    int f() const noexcept { return m_x; }
    int g() const noexcept { return m_x * m_x; }
};

template <typename U, std::size_t... I>
auto get_array_impl(const U& m, std::index_sequence<I...>) {
    return std::array<int, m.size + 1>{ m.g(), (I, m.f())... };
}

template <typename U, std::size_t... I>
auto get_array(const U& m) {
    return get_array_impl(m, std::make_index_sequence<m.size>{});
}


int main()
{
    A<3> x{8};
    auto a = get_array(x);
    
    return 0;
}

在 Coliru 上实时查看。

编译代码会发出警告:

main.cpp:18:50: warning: left operand of comma operator has no effect [-Wunused-value]

   18 |     return std::array<int, m.size + 1>{ m.g(), (I, m.f())... };

虽然很清楚为什么会创建警告(I 实际上被丢弃了),但很明显这不是问题,因为代码实际上并不需要 I 值,而是使用可变参数扩展来重复。m.f()

如何在编译的同时抑制警告?语法是否存在一些变体,可以在不引发警告的情况下给出相同的结果?-Wall

C++ 警告可变 折叠表达式

评论

0赞 francesco 10/4/2023
@rafix07great!是的,这就是我一直在寻找的。多谢!

答:

0赞 saramand9 10/4/2023 #1

您可以通过使用阻止特定警告的语句来避免编译器警告,例如

#pragma GCC diagnostic ignored "-Wunused-variable"