在以下代码中返回对/结构/元组时的参数顺序是不是重要?

Posted

技术标签:

【中文标题】在以下代码中返回对/结构/元组时的参数顺序是不是重要?【英文标题】:Does the order of arguments while returning a pair/struct/tuple matter in following code?在以下代码中返回对/结构/元组时的参数顺序是否重要? 【发布时间】:2020-12-31 21:22:51 【问题描述】:

在下面的代码中,是否正确创建了返回值。我有一些疑问,因为对构造函数的两个参数都是相关的。对第二个参数使用 move 是否会破坏第一个参数。或者如果第一个参数总是在第二个参数之前创建:

class A

    private:
        struct B
        
            int a;
            string b;
            int c;
        ;

        struct C
        
            double d;
            float f;
        ;

        struct Key
        
            int a;
            string b;
            double d;
        ;
        
        struct Data
        
            B x;
            C y;
        ;
        
    public:
        Data data;
        
        using ReturnType = pair<Key, Data>;        
        ReturnType operator()(Source input)
        
            // use input to fill Data
            
            return data.x.a, data.x.b, data.y.d, move(this->data);
            
;

注意:来源可能是数据库游标、标准输入流,也可能是包含相关数据的文件指针。

c++ 标准是否定义了创建对的顺序。 c++11和c++17在这方面有什么区别吗?

【问题讨论】:

如果您还有其他问题,请发布(如在新帖子中)另一个问题。不要扩大你已经得到答案的问题。这会使答案无效,并且是对花时间回答您的人的不尊重。 我只是在修改问题,但你们回复的速度非常快。这不是不尊重。我赞不绝口。我已经按下了向上按钮以获取您的答案。 是的。有些问题会很快得到解答。这并不会使这一点无效。您的修改扩大了范围。 【参考方案1】:

来自this evaluation order reference:

    在list-initialization 中,给定初始值设定项子句的每个值计算和副作用都在每个值计算和与任何初始值项相关联的副作用之前进行排序,在大括号括起来的逗号分隔的初始值设定项列表中。李>

它的意思是在表达式中

data.x.a, data.x.b, data.y.d, move(this->data)

data.x.a, data.x.b, data.y.d 部分将在排序之前(即在之前评估)move(this-&gt;data)

【讨论】:

【参考方案2】:

n3337,C++11 标准草案,包含这一段

[dcl.init.list]

4 在花括号初始化列表的初始化列表中, 初始化子句,包括任何由包扩展产生的子句 ([temp.variadic]),按照它们出现的顺序进行评估。 也就是说,与 给定的初始化子句在每个值计算之前排序 以及与它后面的任何初始化子句相关的副作用 在初始化列表的逗号分隔列表中。 [注:这 无论语义如何,求值顺序都成立 初始化;例如,它适用于 initializer-list 被解释为构造函数调用的参数, 即使通常没有排序限制 调用的参数。 ——尾注]

因此,当使用大括号初始化时,初始化 ReturnType 中的 Key 的参数将在 Data 的参数之前进行完整评估。

此后每个 C++ 标准中都有类似的措辞。

【讨论】:

以上是关于在以下代码中返回对/结构/元组时的参数顺序是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试返回元组时,IDataReader 已关闭

当我的模式只包含一个组时,为啥 re.findall 会返回一个元组列表?

创建元组时如何在末尾避免逗号? [复制]

Python不可变对象元组(tuple)详解

Python 模拟 call_args_list 解包元组以对参数进行断言

Tablix:添加新子列组时的空白单元格