- 主题:这是pack expand,还是pack fold,还是tuple的()和{}的问题?
test::a在初始化的时候用()和{}居然tuple里初始化顺序不一样。用()的时候居然是反过来的,这是为啥?被坑了一个通宵。
#include <iostream>
#include <tuple>
template<class T>
T init_value(int t)
{
if (std::is_same_v<T, int>)
{
std::cout << "int" << std::endl;
return 2;
}
else if (std::is_same_v<T, double>)
{
std::cout << "double" << std::endl;
return t + 0.5;
}
}
template<class...Ts>
struct test
{
// 用a()初始化,顺序是double->int
// 用a{}初始化,顺序是int->double
test(int i)
:a(init_value<Ts>(i)...)
{}
std::tuple<Ts...> a;
};
int main(int argc, char* argv[])
{
test<int, double> t(1);
std::cout << std::get<0>(t.a) << std::endl;
std::cout << std::get<1>(t.a) << std::endl;
}
--
FROM 115.193.169.*
编译器是vs2019
--
FROM 115.193.169.*
函数参数的计算顺序是不确定的,取决于编译器。
一般情况下,vs和linux gcc采用从右到左。这也是C函数参数的默认入栈顺序。
mac gcc采用从左到右。
所以函数功能不能依赖于参数的计算顺序。
【 在 ziqin 的大作中提到: 】
: test::a在初始化的时候用()和{}居然tuple里初始化顺序不一样。用()的时候居然是反过来的,这是为啥?被坑了一个通宵。
:
:
: ...................
--来自微水木3.5.11
--
FROM 223.104.211.*
所以{}不算函数,算一个逗号运算符分割的表达式?
【 在 foliver 的大作中提到: 】
: 函数参数的计算顺序是不确定的,取决于编译器。
: 一般情况下,vs和linux gcc采用从右到左。这也是C函数参数的默认入栈顺序。
: mac gcc采用从左到右。
: ...................
--
FROM 115.193.169.*
Notes
Every initializer clause is sequenced before any initializer clause that follows it in the braced-init-list. This is in contrast with the arguments of a function call expression, which are unsequenced (until C++17)indeterminately sequenced (since C++17).
【 在 ziqin 的大作中提到: 】
: 所以{}不算函数,算一个逗号运算符分割的表达式?
:
:
: ...................
--来自微水木3.5.11
--
FROM 117.136.120.*