在同一行中声明和分配对象一些右值

Posted

技术标签:

【中文标题】在同一行中声明和分配对象一些右值【英文标题】:Declaring and Assigning a object some rvalue in the same line 【发布时间】:2021-08-21 08:13:15 【问题描述】:

我试图复制字符串类函数,我们可以在同一行中声明和分配字符串类对象值某个右值。

例如字符串 s1 = "Hello"

但我试图用整数来做。我的代码是这样的。

#include <iostream>
using namespace std;

class Foo 
    private:
        int a;
    public:
        Foo () 

        
        explicit Foo(int a) 
            this->a = a;
        
        Foo(Foo &obj) 
            this->a = obj.a;
        
        void operator= (int a) 
            cout<<"operator called "<<endl;
            this->a=a;
        
        void print() 
            cout<<"a is "<<this->a<<endl;
        
;

int main () 
    Foo obj2 = 10;  // Getting error here (no int to Foo conversion found) 
    obj2.print();
    return 0;

我知道从我的单参数构造函数中删除显式(即使其成为转换构造函数)可以解决问题,但我想保持 ctor 为显式。有什么办法可以做到这一点?我也尝试重载“=”赋值运算符,但没有运气。请帮忙。

【问题讨论】:

"但是我想保持 ctor 的明确性" 为什么? “在同一行中声明并分配一个 [object] 一些右值”——这里使用的正确术语是“初始化”,因为没有使用赋值运算符。 Foo obj2 = 10; 调用构造函数,而不是 operator=。使其工作的唯一方法是提供有效的构造函数(删除显式)。 @Jodocus 没有具体原因。只是出于好奇-如果不使 ctor 隐含,就不可能做到这一点吗? ctor 是否也隐含在原始字符串类中? string s1 = "Hello"; 这里没有右值。 "Hello" 是一个字符串字面量,被传递给std::string s1 的构造函数,没有创建右值。 【参考方案1】:

根据 Bjarne 的说法,声明构造函数 explicit 的主要目的是使隐式转换非法,例如

void Bar(Foo a);

Foo obj2 = 10;  // illegal, conversion int to Foo
Bar(10);        // illegal too

这些应该被显式地转换

Foo obj2 = Foo(10);
Bar(Foo(10)); 

【讨论】:

以上是关于在同一行中声明和分配对象一些右值的主要内容,如果未能解决你的问题,请参考以下文章

这是在latex中编写的伪代码,如何使得if和then语句在同一行上,节省空间并看起来美观一些。

为啥在同一行上分配变量后shell内置冒号命令“:”会导致分配空字符串值?

在同一行声明的多个字段的可访问性

在 Excel 中剪切/粘贴在同一行中的重复金额

如何在 C# 中与输出在同一行中返回字符串和 int 变量?

java面向对象中的一些特性