重复的风险很高,
在C ++中,如果你有自定义析构函数,你可能需要编写自己的复制构造函数和复制赋值运算符。
在C ++ 11中,您可能还需要移动构造函数并移动赋值运算符。
如果存在自定义析构函数,为什么编译器会自动生成所有这些方法?
问题不会询问自动生成所有这些方法的条件是什么。
问题是为什么决定添加自动生成的方法,甚至IF ( OBJECT_ID('tempdb..#tmp') IS NOT NULL )
DROP TABLE #tmp;
CREATE TABLE #tmp
(
[Date] DATETIME
,[Revenue] DECIMAL(18, 2)
);
--
DECLARE @first INT = 0
,@last INT = 200;
WHILE @first < @last
BEGIN
INSERT INTO #tmp
( Date, Revenue )
VALUES ( GETDATE() - @first * 0.5, RAND() * 100000 );
SET @first = @first + 1;
END;
。
由于生成了这些方法,我可以发布几个破坏代码的例子,例如:
d-tor
此处复制或移动对象时会发生灾难。
答案 0 :(得分:3)
在我从谢尔盖祖布科夫的帮助下做了一些研究后,似乎&#34; Praetorian&#34;给出部分答案。
在C++11
中,生成copy c-tors
是为了向后兼容。
Move c-tors
未生成,因为这是C++11
中引入的功能。
但是,如果您将clang
与-Wdeprecated
一起使用,则会发出警告。这是一个示例程序:
class FileDescriptorGuard;
int main(){
FileDescriptorGuard x(5);
FileDescriptorGuard y = x;
}
这是编译器输出:
$ clang -Wdeprecated -std=c++11 x.cc -lstdc++
x.cc:9:5: warning: definition of implicit copy constructor for 'FileDescriptorGuard' is deprecated because it has a user-declared
destructor [-Wdeprecated]
~FileDescriptorGuard(){
^
x.cc:16:26: note: implicit copy constructor for 'FileDescriptorGuard' first required here
FileDescriptorGuard y = x;
^
1 warning generated.
如果您使用gcc
,则没有此类警告。