// 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");
}
警告:對“i”的操作可能未定義 [-Wsequence-point]
對于上面的代碼,只有 gcc 認為i 包擴展存在問題,并且僅當分配用于元組時。clang 似乎可以在沒有警告的情況下編譯和運行。
這是 gcc 中的錯誤還是 clang 沒有報告此警告?
uj5u.com熱心網友回復:
警告是錯誤的,請參閱此處的規則 (10) :
在串列初始化中,給定初始化器子句的每個值計算和副作用都在每個值計算和副作用之前排序,該值計算和副作用與在花括號括起來的逗號分隔的初始化器串列中跟隨它的任何初始化器子句相關聯。
該規則應該同樣影響元組和向量的花括號初始化。
請注意,這不是折疊運算式,只是包擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/346455.html
