Gdy wymóg kopiowania jest/nie był gwarantowany (lub wymagany) przez standard, nie ma wymogu, aby kompilator go zaimplementował.
Oznaczało to, że standardowe kompilatory mogą obsługiwać kopiowanie, ale nie wymagały tego. W praktyce pewna liczba dostawców kompilatorów zdecydowała się nie wdrażać funkcji kopiowania. Dla tych sprzedawców jest to kwestia kosztów - brak implementacji funkcji pochłania mniej wysiłku programistów. Dla programistów (osób używających kompilatorów) była to kwestia jakości wdrożenia - kompilator wyższej jakości był bardziej skłonny do wprowadzania pożądanych optymalizacji, w tym kopiowej elizacji, niż kompilator o niższej jakości - ale także droższy w pozyskiwaniu.
Z biegiem czasu, ponieważ kompilatory wyższej jakości stają się swobodniej dostępne (przez różne definicje "bezpłatne" - nie wszystkie są równoważne zerowym kosztom), stopniowo standard jest w stanie wydać więcej funkcji, które wcześniej były opcjonalne. Ale tak się nie zaczęło.
Z opcjonalną kopią niektóre kompilatory bazowałyby na dostępności odpowiednich konstruktorów kopii itp., A niektóre nie. Jednak pojęcie kodu, które spełnia wymagania normy, budowane za pomocą jednego zgodnego kompilatora, ale nie innego, jest naturalnie niepożądane w standardzie. W związku z tym w standardzie zalecono, aby konstruktorzy byli dostępni, nawet jeśli zezwalają na ich usunięcie.
Dlaczego drugi kompilator nie wykonałby elizacji kopiowania, kiedy to się wydarzy? –
Mogło, ale nie było wymagane. Być może było to "trudne" w niektórych przypadkach? W każdym razie była tam reguła, aby kompilator działał w obu kierunkach. –
@WakeupBrazil Standardowa komisja C++ jest * bardzo * ostrożna w podejmowaniu decyzji. Mogły istnieć nieprzewidziane przypadki, w których kopiowanie byłoby pesymizacją, więc pozostawili wybór kompilatorowi. W C++ 17, z dodatkowym doświadczeniem, zdecydowali, że szanse na to wydarzenie są znikome, więc w razie potrzeby zostanie zapewniona zgoda na kopiowanie. – Quentin