请原谅令人费解的标题,并考虑以下代码:
#include <memory>
#include <utility>
using X = std::unique_ptr<int>;
using A = std::pair<int, const X>;
using B = std::pair<int, X>;
static_assert(std::is_constructible<A, B>::value, "(1)"); // Ok.
static_assert(std::is_convert
考虑一下
struct S
{
S() = default;
S(S const&) = delete;
// S(S&&) = delete; // <--- uncomment for a mind-blowing effect:
// MSVC starts compiling EVERY case O_O
};
S foo() { return {}; }
struct X : S
{
// X() : S(foo()) {} // <----- all com
我成长的时候,传递结构是不好的魔力,因为它们通常很大,所以指针总是最好的方法。现在C++11有了很好的RVO (右值优化),我想知道下面这样的代码是否有效。
如你所见,我的类有一堆向量结构(不是指向它们的指针)。构造函数接受值结构并将其存储起来。
我的希望是,编译器将使用移动语义,这样就不会发生数据复制;构造函数将(在可能的情况下)接管传入的值的所有权。
有没有人知道这是不是真的,并且是自动发生的,或者我需要一个带有&&语法的移动构造函数,等等?
// ParticleVertex
//
// Class that represents the particle vertice
在我的C++课上,我们正在学习使用函数对象之类的东西,但现在我们得到了一个可以在老师的编译器上运行的代码片段(我们使用的是不同的操作系统)。
我们用几个编译器(MSVC,clang)测试了下面的代码片段,他们都拒绝了它,有点被最小化了:
#include <functional>
struct Fraction {
Fraction();
Fraction(int z, int n);
Fraction(Fraction&);
// various data members
};
struct FractionComparator {
int op
当返回容器时,我总是必须确定是使用返回值还是使用输出参数。如果性能重要,我选择了第二个选项,否则我总是选择第一个选项,因为它更直观。
坦率地说,我个人强烈反对输出参数,可能是因为我的数学背景,但在没有其他选择的情况下使用它们是可以的。
然而,当涉及到通用编程时,事情已经完全改变了。在有些情况下,函数可能不知道它返回的对象是一个巨大的容器还是一个简单的值。
始终如一地使用输出参数可能是我想知道是否可以避免的解决方案。如果我不得不这么做,那真是太尴尬了
int a;
f(a, other_arguments);
与
auto a = f(other_arguments);
此外,有时返回类型的f(
我正在尝试确定C++函数返回一个包含构造函数和析构函数的对象是否安全。我对该标准的理解是,它应该是可能的,但我用简单示例进行的测试表明,它可能会有问题。例如下面的程序:
#include <iostream>
using namespace std;
struct My
{ My() { cout << "My constructor " << endl; }
~My() { cout << "My destructor " << endl; }
};
My function() { My my
我是汇编代码的初学者。在使用C++进行开发时,我注意到了一些我不理解的由MSVC生成的汇编代码。有问题的代码是:
00DA1965 push 4 // The number of bytes we want
00DA1967 call operator new (0DA1339h) // Call to 'new' to allocate memory
00DA196C add esp,4 // Add the 4 bytes to the stack pointer
00DA196F mov dword pt
假设我有这个功能:
template <class A>
inline A f()
{
A const r(/* a very complex and expensive construction */);
return r;
}
声明r const是个好主意,因为const变量不能移动?注意,返回的值不是const。我所担心的是,r确实是const,但宣布它为const可能不是一个好主意。然而,限定符应该有助于编译器生成更好的代码。
对于此计划
#include <iostream>
using std::cout;
struct C
{
C() { cout << "Default C called!\n"; }
C(const C &rhs) { cout << "CC called!\n"; }
};
const C f()
{
cout << "Entered f()!\n";
return C();
}
int main()
{
C a = f();
C