c++ - 多个值可以隐式转换为一个对象吗?

标签 c++ implicit-conversion

有没有办法在将多个变量传递给函数时将它们隐式转换为类对象?它适用于单个变量,但是当我尝试传递多个变量时,它无法编译。

class B {
public:
    B(int x = 20, bool b = false)
    {
        std::cout << x << " " << b << std::endl; 
    }
};

void doSomething(B obj) { }

int main() {
    doSomething(30);
    // doSomething(30,false);  // won't compile
    ...
}

打印

30 0

然后我尝试将它们括在括号中,并编译它,但它预先计算逗号分隔的表达式,因此仅将一个值作为 int 传递。

    ....
    doSomething((30,true));
}

打印

1 0

最佳答案

它无法编译,因为您定义了一个需要一个参数的函数,但随后您尝试通过传递两个参数来调用它。因此,编译器正确地报告错误。

如果将两个参数括在括号中,正如您所注意到的,首先计算逗号表达式,然后构造对象。实际上,就好像您编写了:

doSomething( B( ( 30 , false ) ) )

因此,您可以做的是:

  1. 显式构造临时对象:

    doSomething( B( 30 , false ) );

  2. 或者使用初始化列表:

    doSomething( { 30 , false } );

关于c++ - 多个值可以隐式转换为一个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76989543/

相关文章:

c++ - 普通模板在哪里结束,元模板从哪里开始?

c++ - 是否可以使用非常量键类型的 unordered_map?

c++ - 强制 C++ 更喜欢带有隐式转换的重载而不是模板

c - 为什么在使用 gcc C 将 uint32 转换为 uint8 时没有警告

c++ - 如何在 C++ 中取消转义 UTF-8 字符串

c++ - 为什么 cout 一个简单的 char* 不起作用?

c++ - 'B::operator A' 使用未定义类 'A'

c# - 为隐式转换启用编译器警告 (C#)

c# - 如何编写从接口(interface)到另一种类型的隐式转换?

c# - 在 C# 中输入别名