我很确定这个问题的答案是"从来没有,模板可以成为复制构造函数."
不幸的是,我花了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++计算机编程中,复制省略指的是一种编译器优化技术,它消除了不必要的对象复制.让我们考虑以下代码
#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)