为什么在使用可变参数时调用复制构造函数而不是隐式转换运算符
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
以初始化可变参数之一。
我有以下代码:
#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
以初始化可变参数之一。