为什么在使用可变参数时调用复制构造函数而不是隐式转换运算符

Why is copy-ctor called instead of implicit conversion operator when using variadic arguments

我有以下代码:

#include <iostream>

class Dog
{
public:
    Dog() : ptr(nullptr)
    {
        std::cout << "ctor" << std::endl;
    }

    Dog(const Dog&) = delete;
    Dog(Dog&&) = delete;

    inline operator void*() const
    {
        std::cout << "conversion op" << std::endl;
        return ptr;
    }

private:
    void* ptr;
};

void dosomething_buf(void*)
{

}

void dosomething(const Dog& d)
{
    dosomething_buf(d);
}

int main()
{
    Dog d;
    dosomething(d);
}

此代码按预期工作并调用一次 ctor 和隐式转换运算符。

但是,如果我将 dosomething_buf(void*) 的签名更改为 void dosomething_buf(...);

我得到以下编译错误:

[build] [ 50%] Building CXX object CMakeFiles/playground.dir/test.cpp.o
[build] /media/rbs42/data/Gebos/RBS42/PlayGround/test.cpp: In function ‘void dosomething(const Dog&)’:
[build] /media/rbs42/data/Gebos/RBS42/PlayGround/test.cpp:31:20: error: use of deleted function ‘Dog::Dog(const Dog&)’
[build]      dosomething_buf(d);
[build]                     ^
[build] /media/rbs42/data/Gebos/RBS42/PlayGround/test.cpp:11:5: note: declared here
[build]      Dog(const Dog&) = delete;
[build]      ^~~

为什么编译器调用copy-ctor?

既然不再有 void* 参数,为什么您会期望调用 void* 转换运算符?

C-style variadic functions(顺便说一句,在 C++ 中 不推荐 ,因为我们有 varadic 模板)按值获取任意数量的参数。调用 dosomething_buf(d) 时,您正在复制 d 以初始化可变参数之一。