相关疑难解决方法(0)

列表初始化中元素的评估顺序

另一个主题中,@ Didmar给出了这个解决方案:

template <typename... T>
std::tuple<T...> parse(std::istream& in) 
{
    return std::tuple<T...>{ T(in)... };
}
Run Code Online (Sandbox Code Playgroud)

说明,

大括号初始化的使用起作用,因为大括号初始化列表中参数的求值顺序是它们出现的顺序.(强调我的)

C++标准(n3485)的相关文本是,

在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.[注意:无论初始化的语义如何,此评估顺序都保持不变; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束. - 尾注]


所以我尝试用以下代码测试它:

template<int N>
struct A 
{ 
    std::string data;
    A(std::istream & stream) { stream >> data; }
    friend std::ostream& operator<<(std::ostream & out, A<N> const & a) 
    {
        return out << "A"<<N<<"::data = " << a.data;
    }
};
typedef A<1> A1;
typedef A<2> A2;

template<typename ...Args>
void test(std::istream & stream)
{
    std::tuple<Args...> args { Args(stream)... }; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-precedence initializer-list c++11

21
推荐指数
1
解决办法
2047
查看次数

可变参数模板参数:我可以根据类型选择参考值和值吗?

编辑不是对静态类成员未定义引用的重复.那个问题探讨了问题的原因(我在下面解释).在这里,我正在寻找与那些问题的答案中提出的解决方案不同的解决方案(这意味着更改constexpr要使用的变量的声明/定义- 主要是通过在编译单元中添加定义).

我已经创建了一个小的可变参数模板函数make_string()来生成std::string任意数量的io-able参数,如下所示.

using std::ostringstream; // just for this example

inline ostringstream&write(ostringstream&ostr, const char*x)
{ if(x) ostr<<x;  return ostr; }

template<class T>
inline ostringstream&write(ostringstream&ostr, T const&x)
{ ostr<<x;  return ostr; }

inline ostringstream&write(ostringstream&ostr) noexcept
{ return ostr; }

template<class T, class... R>
inline ostringstream&write(ostringstream&ostr, T const&x, R&&... r)
{ return write(write(ostr,x), std::forward<R>(r)...); }

inline std::string make_string(const char*text)
{ return {text?text:""}; }

inline std::string …
Run Code Online (Sandbox Code Playgroud)

c++ templates argument-passing variadic-templates c++11

5
推荐指数
1
解决办法
449
查看次数