我已经看到了相关的问题,他们主要谈论我们是否应该将const rvalue引用作为参数.但我仍然无法解释为什么在以下代码中调用非const移动构造函数:
#include <iostream>
using namespace std;
class A
{
public:
A (int const &&i) { cout << "const rvalue constructor"; }
A (int &&i) { cout << "non const rvalue constructor"; }
};
int const foo (void)
{
const int i = 3;
return i;
}
int main (void)
{
A a(foo());
}
Run Code Online (Sandbox Code Playgroud) 以下代码
class A {
public:
A() {} // default constructor
A(int i) {} // second constructor
};
int main() {
A obj({});
}
Run Code Online (Sandbox Code Playgroud)
调用第二个构造函数.可能将空initializer_list视为一个参数并转换为int.但是当你从类中删除第二个构造函数时,它会调用默认的构造函数.为什么?
另外,我理解为什么A obj { {} }总是会调用带有一个参数的构造函数,因为我们传递的是一个空的参数initializer_list.
在 c++98 中,以下程序应调用复制构造函数。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "default" ; }
A(int i) { cout << "int" ; }
A(const A& a) { cout << "copy"; }
};
int main ()
{
A a1;
A a2(0);
A a3 = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您在上述情况下显式声明复制构造函数(编译器出错),这很明显。但是当它未声明为显式时,我看不到复制构造函数的输出。我想这是因为复制省略。有什么方法可以禁用复制省略或标准是否强制要求?
我提到Scott Meyers的"更有效的C++"用于自动类型演绎.提到的是与模板类型推导相同的方式,并且提到了3种情况.我的问题属于案例3(当ParamType不是指针或引用时),但结果与所描述的不匹配.
#include <iostream>
int main (void)
{
auto i = 2;
const auto c = &i;
*c = 4;
std::cout << "i is " << i;
}
Run Code Online (Sandbox Code Playgroud)
它应该工作
template<typename T>
void f(const T param);
f(&i); // int *
Run Code Online (Sandbox Code Playgroud)
所以,T这里应该匹配int *和完整的类型param应该是const int *.
但是,正如上面的程序所示,c不是,const int *而是int *.
有人可以解释我在这里错过了什么吗?