相关疑难解决方法(0)

MI和隐式复制构造函数bug(是:在什么条件下模板可以作为复制构造函数?)

我很确定这个问题的答案是"从来没有,模板可以成为复制构造函数."

不幸的是,我花了3个小时搞清楚为什么我会收到关于递归的警告,跟踪它到复制构造函数,看着调试器发疯了,不让我看看递归代码,最后追踪到了一个缺失的'& '在基础构造函数中.

你看,我有这个复杂的基于策略的设计主机,现在已经工作了一段时间.我在一个中重写了两个策略,然后遇到了一个递归的复制构造函数.将其缩小为一个策略,该策略需要提供一个构造函数,该构造函数可以采用某种类型的XXX概念作为其参数,但在这种情况下,我只是丢弃它.所以我写了

struct my_policy
{
  template < typename T >
  my_polity(T const) {} // missing '&'...oops
};
Run Code Online (Sandbox Code Playgroud)

现在,my_policy是主机的基类(当然),这个小错误导致递归,其中主机的复制构造函数将链自身传递给这个模板化构造函数,而不是隐式的,编译器生成的复制构造函数.然后它当然会再次调用它的复制构造函数来创建临时的.

真正令人着迷的是我无法在简化代码中重新创建它.即使有一种模拟政策主持人的例子,我也无法实现.以下代码不会出现此问题:

#include <boost/utility/enable_if.hpp>
#include <boost/mpl/bool.hpp>

struct base
{
  template < typename T >
  base(T const) {}
};

struct another_base 
{
  int x;

  another_base(int y) : x(y) {}
};

template < typename T >
struct is_derived : boost::mpl::false_ {};

template < typename T1, typename T2 >
struct derived : T1, T2
{
  template < typename T >
  derived(T const& x, typename …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance

5
推荐指数
2
解决办法
572
查看次数

复制方法

从复制省略方法的标准定义:在C++计算机编程中,复制省略指的是一种编译器优化技术,它消除了不必要的对象复制.让我们考虑以下代码

#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C 
{
 C (int) {}
 C(const C&) {++n;}      



       };
int main(int argc, char *argv[])
{
    C c1(42);
    C c2=42;




return n;
}
Run Code Online (Sandbox Code Playgroud)

这行"return n"将返回0或1,具体取决于副本是否被删除.

也考虑这段代码

#include <iostream>

struct C {
  C() {}
  C(const C&) { std::cout << "Hello World!\n"; }
};

void f() {
  C c;
  throw c; // copying the named object c into the exception object.
}          // It is unclear whether this copy may be elided. …
Run Code Online (Sandbox Code Playgroud)

c++ oop

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

标签 统计

c++ ×2

multiple-inheritance ×1

oop ×1