分配给元组时使用包扩展的序列点警告

sequence-point warning using pack expansion when assigning to tuple

// https://godbolt.org/z/e7ebq6hYE

int print(std::string str, int i){
    std::cout << i << str << std::endl;
    return i;
}

template<typename ... Args>
void concat(Args ... args) {
    int i = 2;
    std::tuple<int, int, int, int> ret { print("ss", -22), print(args, i++) ... }; // gcc warning
    std::vector<int> ret1 { print("ss", -22), print(args, i++) ... };
}

int main()
{
    concat("a", "b", "c");
}

warning: operation on 'i' may be undefined [-Wsequence-point]

对于上面的代码,只有 gcc 似乎认为包扩展中的 i++ 存在问题,并且仅当赋值是针对元组时。 clang 似乎可以编译并且 运行 没有警告。

是gcc的bug还是clang没有报这个警告?

警告错误,见规则(10)here:

In list-initialization, every value computation and side effect of a given initializer clause is sequenced before every value computation and side effect associated with any initializer clause that follows it in the brace-enclosed comma-separated list of initalizers.

该规则应同样影响元组和向量的大括号初始化。


请注意,这不是折叠表达式,只是包扩展。