我试图理解移动构造函数和赋值操作在C++ 11中的工作方式,但是我遇到了委托父类的问题.
代码:
class T0
{
public:
T0() { puts("ctor 0"); }
~T0() { puts("dtor 0"); }
T0(T0 const&) { puts("copy 0"); }
T0(T0&&) { puts("move 0"); }
T0& operator=(T0 const&) { puts("assign 0"); return *this; }
T0& operator=(T0&&) { puts("move assign 0"); return *this; }
};
class T : public T0
{
public:
T(): T0() { puts("ctor"); }
~T() { puts("dtor"); }
T(T const& o): T0(o) { puts("copy"); }
T(T&& o): T0(o) { puts("move"); }
T& operator=(T const& o) …
Run Code Online (Sandbox Code Playgroud) 对于不修复 C++ 的某些问题的常见解释是,它会破坏 ABI 并需要重新编译,但另一方面,我遇到这样的语句:
老实说,这对于几乎所有 C++ 非 POD 类型都是如此,而不仅仅是例外。可以跨库边界使用 C++ 对象,但通常前提是所有代码都使用相同的工具和标准库进行编译和链接。这就是为什么 MSVC 的所有主要版本都有 boost 二进制文件。
(来自这个SO答案)
那么C++有稳定的ABI吗?
如果是这样,我可以混合和匹配在同一平台上使用不同工具集编译的可执行文件和库(例如 Windows 上的 VC++ 和 GCC)吗?如果没有,有什么办法可以做到吗?
更重要的是,如果 C++ 中没有稳定的 ABI,为什么人们如此担心破坏它?
常见的建议是在几乎所有情况下都优先std::map::try_emplace
使用std::map::emplace
。
我编写了一个简单的测试来跟踪调用这些函数时的对象创建/复制/移动/销毁,无论是否发生冲突,结果表明,try_emplace
当密钥尚未在地图中时,会产生额外的移动和销毁密钥。
为什么行为上有差异?
我确实知道移出对象的移动和销毁通常很便宜,尤其是对于琐碎的键来说,但我仍然对结果感到惊讶,因为它们似乎暗示在某些情况下可能会emplace
更有效。
编译器资源管理器链接(Clang 14、libc++、-O3)
来源:
#include <map>
#include <iostream>
struct F {
F(int i): i(i) { std::cout << "- ctor (" << i << ")\n"; }
~F() { std::cout << "- dtor (" << i << ")\n"; }
F(const F& f): i(f.i) { std::cout << "- copy ctor (" << i << ")\n"; }
F(F&& f): i(f.i) { std::cout << "- move ctor (" << i << ")\n"; } …
Run Code Online (Sandbox Code Playgroud) 我知道我可以让 VSCode 在调试器下启动程序时提示我输入命令行参数,方法是在 launch.json 中指定如下内容:
{
"configurations": [
{
"name": "(gdb) Launch MyApp",
"type": "cppdbg",
"program": "MyApp",
"args": [ "${input:arg}" ],
}
],
"inputs": [
{
"type": "promptString",
"id": "arg",
"description": "Enter argument",
"default": "something"
},
]
}
Run Code Online (Sandbox Code Playgroud)
但是,这只允许我输入一个参数。要输入多个,我可以在args
数组中有多个条目,每个参数一个。
不幸的是,当我想测试零到 N 命令行参数的不同组合时,这不会扩展,因为它需要在每次调用之前编辑 launch.json。
有没有办法让 VSCode 在一行中提示我输入所有命令行参数,就像我在终端上输入它们一样?
c++ command-line-arguments visual-studio-code vscode-debugger
struct Thing {
std::string something;
};
Run Code Online (Sandbox Code Playgroud)
Clang-tidy 抱怨:
warning: an exception may be thrown in function 'Thing' which should not throw exceptions [bugprone-exception-escape]
我知道该bugprone-exception-escape.FunctionsThatShouldNotThrow
设置,但我不知道该放什么来抑制所有包含字符串的结构的警告。
有什么建议么?
我想将派生结构的所有成员归零.
每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.
结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是POD.
除了练习的标准皱眉外,您是否看到以下任何问题?
struct Base
{
// Stuff
};
struct Derived : public Base
{
// Hundreds of fields of different built-in types
// including arrays
Derived()
{
::memset(reinterpret_cast<char*>this + sizeof (Base), 0, sizeof *this - sizeof (Base));
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
尽管 C++ 没有强制要求,但常见的做法是从异常对象std::exception
或其子类之一派生。
我知道的唯一例外(不是双关语)是boost::thread_interrupted
. (std::nested_exception
应该用作混合而不是直接抛出)。
此外,catch (...)
无法提供有关它捕获的异常的任何信息。
鉴于此,在新代码中catch (...)
代替或补充使用的原因(如果有)是什么?catch (std::exception const&)
c++ ×7
abi ×1
c++11 ×1
clang-tidy ×1
constructor ×1
emplace ×1
exception ×1
memset ×1
sizeof ×1
stdmap ×1
visual-c++ ×1