小编san*_*pta的帖子

为什么在这种情况下调用非const rvalue移动构造函数?

我已经看到了相关的问题,他们主要谈论我们是否应该将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)

c++ language-lawyer move-semantics

8
推荐指数
1
解决办法
161
查看次数

作为参数的空初始化列表不调用默认构造函数

以下代码

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++ c++11 list-initialization

6
推荐指数
1
解决办法
360
查看次数

有没有办法在 C++ 编译器中禁用复制省略

在 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)

如果您在上述情况下显式声明复制构造函数(编译器出错),这很明显。但是当它未声明为显式时,我看不到复制构造函数的输出。我想这是因为复制省略。有什么方法可以禁用复制省略或标准是否强制要求?

c++ initialization copy-constructor

4
推荐指数
1
解决办法
3107
查看次数

当ParamType既不是指针也不是参考时,自动类型推导

我提到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 *.

有人可以解释我在这里错过了什么吗?

c++ pointers auto c++11 type-deduction

1
推荐指数
1
解决办法
99
查看次数