分配给元组时使用包扩展的序列点警告
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.
该规则应同样影响元组和向量的大括号初始化。
请注意,这不是折叠表达式,只是包扩展。
// 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.
该规则应同样影响元组和向量的大括号初始化。
请注意,这不是折叠表达式,只是包扩展。