有人可以解释为什么每个人都std::unique_ptr按值传递而不是按右值引用传递吗?
据我观察,这需要调用额外的移动构造函数。
这是一个持有“指针”的类的示例。需要 3 个 move-ctor 调用才能按值获取它,而需要 2 个调用才能按引用获取它:
#include <memory>
#include <iostream>
class pointer {
public:
pointer()
{ std::cerr << "ctor" << std::endl; }
pointer(const pointer&)
{ std::cerr << "copy-ctor" << std::endl; }
pointer& operator=(const pointer&)
{ std::cerr << "copy-assignment" << std::endl; return *this; }
pointer(pointer&&)
{ std::cerr << "move-ctor" << std::endl; }
pointer& operator=(pointer&&)
{ std::cerr << "move-assignment" << std::endl; return *this; }
~pointer()
{ std::cerr << "dtor" << std::endl; }
};
class A {
public: …Run Code Online (Sandbox Code Playgroud) 我无法构建此错误“未定义对 CustomUndoStack 的 vtable 的引用”
这是代码:
class CustomUndoStack : public QObject
{
Q_OBJECT
public:
};
int main(int argc, char *argv[])
{
QCoreApplication qCoreApplication(argc, argv);
CustomUndoStack uStack;
return qCoreApplication.exec();
}
Run Code Online (Sandbox Code Playgroud)
这是 .pro 文件:
QT += widgets
CONFIG += c++14 console
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)
我已经手动删除了构建目录,我已经以所有可能的方式尝试了“全部清理”和“重新构建全部”,我已经运行了 qmake 100500 次,我已经更改了 CustomUndoStack 界面超过 9000 次,但没有任何帮助。
问题出在哪里?
UPD 回答评论:如果我删除 Q_OBJECT 行,那么我就不能这样做。它说“没有这样的信号 QObject::undoSignal()”
class CustomUndoStack : public QObject
{
// Q_OBJECT
public:
CustomUndoStack() {
connect(this, SIGNAL(undo_signal()), &undoStack, SLOT(undo()));
}
signals: …Run Code Online (Sandbox Code Playgroud) 当我使用带有这样一个命令的ShellExecuteEx时,"-unused parameter -action capturescreenshot -filename C:\\ATDK\\Screenshots\\abcd.jbg"一切正常,Executor.exe以char* argv[]所有大约开始.9个参数.但是当命令有更多符号时,例如文件名是"abc ... xyz.jpg",那么该进程有argc == 1且命令为空.所以在发送到ShellExecute之前命令没问题我将其更改为ShellExecute,而不是Ex,它可以工作!命令可能很长,并且成功通过.任何人都能解释一下有什么区别吗?这是我填写SHELLEXECUTEINFO的代码.
std::wstringstream wss;
wss << L"-unused" << " " // added because we need to pass some info as 0 parameter
<< L"parameter" << " " // added because EU parser sucks
<< L"-action" << " "
<< L"capturescreenshot" << " "
<< L"-filename" << " "
<< L"C:\\ATDK\\Screenshots\\abc.jpg";
SHELLEXECUTEINFO shell_info;
ZeroMemory(&shell_info, sizeof(shell_info));
shell_info.cbSize = sizeof(SHELLEXECUTEINFO);
shell_info.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
shell_info.hwnd = NULL;
shell_info.lpVerb = …Run Code Online (Sandbox Code Playgroud)