Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动赋值是否可以具有r值表达式结果以外的类型?_C++_Operator Overloading_C++17_C++20_Conversion Operator - Fatal编程技术网

C++ 自动赋值是否可以具有r值表达式结果以外的类型?

C++ 自动赋值是否可以具有r值表达式结果以外的类型?,c++,operator-overloading,c++17,c++20,conversion-operator,C++,Operator Overloading,C++17,C++20,Conversion Operator,考虑以下几点: auto tmp = a + b; 其中a和b是用户定义的类型,它们返回一个代理对象来延迟计算,这对于比所示更复杂的表达式是必需的 在这种情况下,有没有一种方法可以使结果不是运算符重载的结果类型 我想知道,带r/l值说明符T运算符的隐式转换运算符&&在这里是否有用,但我不太清楚如何使用 我理解这个问题含糊不清,缺乏细节,但我认为我想要的概念非常简单 如果我不想做自动tmp=。。。而是一些具体类型的tmp=。。。但是在构造函数中使用代理。auto总是从初始值设定项推断其类型。它不

考虑以下几点:

auto tmp = a + b;
其中a和b是用户定义的类型,它们返回一个代理对象来延迟计算,这对于比所示更复杂的表达式是必需的

在这种情况下,有没有一种方法可以使结果不是运算符重载的结果类型

我想知道,带r/l值说明符T运算符的隐式转换运算符&&在这里是否有用,但我不太清楚如何使用

我理解这个问题含糊不清,缺乏细节,但我认为我想要的概念非常简单

如果我不想做自动tmp=。。。而是一些具体类型的tmp=。。。但是在构造函数中使用代理。

auto总是从初始值设定项推断其类型。它不会应用转换,除非你自己这样做,而且它会删除顶级参考和简历资格

如果您的初始化表达式导致某个代理而不是具体类型,则auto将被推断为该代理。

auto总是从初始值设定项推断其类型。它不会应用转换,除非你自己这样做,而且它会删除顶级参考和简历资格


如果您的初始化表达式导致某个代理而不是具体类型,那么auto将被推断为。

所以通常a+b会延迟计算,但现在您希望它不会延迟并立即计算T类型的值?期望operator+在没有被告知的情况下表现不同似乎不一致。也许更多关于延迟评估的方式/原因以及应该何时开始的细节将有助于澄清问题。@super我所写的案例微不足道,但我认为如果我可以将多个操作符链接在一起,那么我可以应用一些非常重要的优化。因此,自动tmp=a+b+c;在我的用例中,使用then代理可能比自动tmp0=a+b快得多;自动tmp1=tmp0+c;自动tmp=a+b+c;将tmp的类型设置为完整表达式的最终结果是什么,这将是+c返回的任何类型。人们建议在这种情况下应用运算符auto,以便生成“真实”值而不是“延迟”值,但它还没有出现。具体来说。最后一次出现在2017年多伦多。所以通常a+b会延迟评估,但现在你希望它不会延迟并立即评估T型的值?期望operator+在没有被告知的情况下表现不同似乎不一致。也许更多关于延迟评估的方式/原因以及应该何时开始的细节将有助于澄清问题。@super我所写的案例微不足道,但我认为如果我可以将多个操作符链接在一起,那么我可以应用一些非常重要的优化。因此,自动tmp=a+b+c;在我的用例中,使用then代理可能比自动tmp0=a+b快得多;自动tmp1=tmp0+c;自动tmp=a+b+c;将tmp的类型设置为完整表达式的最终结果是什么,这将是+c返回的任何类型。人们建议在这种情况下应用运算符auto,以便生成“真实”值而不是“延迟”值,但它还没有出现。具体来说。最后一次出现在多伦多2017。嗯,好的,我有没有办法使上述表达式非法,从而强制用户键入已计算的非代理类型,该类型将代理作为隐式构造函数。@111111您可以将代理类型的构造函数设为受保护的或私有的,并授予友人访问具体类型的权限。这将允许您在具体类型函数中创建代理类型的对象,但不允许您在具体类函数之外创建实例。这似乎是合理的。我将等待,看看是否有其他人有任何其他建议,但如果没有一点,我会接受这个答案。@111111我的建议可能不会100%适用于你。使用C++17保证的副本省略,仍然可以在非友元代码中构造具有私有构造函数的对象:。请参阅:@NathanOliver似乎很合理-NoCreate通过friend声明hmm专门指定Create作为工厂,好的,是否有一种方法可以使上述表达式非法,从而强制用户键入已计算的非代理类型,该类型将代理作为隐式构造函数。@111111您可以使代理类型的构造函数受保护或私有,并授予友人访问具体类型的权限。这将允许您在具体类型函数中创建代理类型的对象,但不允许您在具体类函数之外创建实例。这似乎是合理的。我将等待,看看是否有其他人有任何其他建议,但如果没有一点,我会接受这个答案。@111111我的建议可能不会100%适用于你。使用C++17
保证复制省略仍然可以构造在非友元代码中具有私有构造函数的对象:。请参阅:@NathanOliver似乎很合理-NoCreate通过friend声明专门指定Create作为工厂