Wdeprecated-copy on system type

Csaba Raduly rcsaba@gmail.com
Thu Jun 28 11:49:00 GMT 2018

On Wed, Jun 27, 2018 at 1:28 PM, Jonathan Wakely wrote:
> Your mail is off-topic on this list, it would be appropriate on the
> gcc-help list, or in Bugzilla if you want to report a bug.
> On Wed, 27 Jun 2018 at 11:27, Csaba Raduly wrote:
>> 1. Why is a warning emitted only for the const srange?
> Because line 16 doesn't use the sub_range copy constructor, it calls
> this instead:
>         template< class ForwardRange2 >
>         sub_range(
>             ForwardRange2& r,
>             BOOST_DEDUCED_TYPENAME ::boost::enable_if<
>                 is_compatible_range<ForwardRange2>
>             >::type* = 0
>         )
>         : base(impl::adl_begin(r), impl::adl_end(r))
>         {
>         }
> This might be a Boost bug, albeit a harmless one. IMHO the template
> constructor should be constrained so it isn't used for copying
> non-const lvalues.

So the fact that there's no warning for the non-const version is in
fact a bug in Boost, right?

(It's still like that in latest, not yet released Boost 1.68).

This sounds like a "greedy template" you spoke about at ACCUcon 2018.

>> 2. Shouldn't boost be exempt from this warning, given that it's
>> included from a system directory (/usr/include) ?
> Yes, it probably should, but see below.
>> Shouldn't the "implicitly declared copy constructor" error be located
>> at the class definition (boost header), rather than where it's being
>> called (the call which does pass-by-value) ?
> The warning is only issued at the point where the implicit definition
> is needed, to avoid issuing warnings when the object is never copied.
> It's needed at the call site in your code, not in the system header
> (well, it might also be needed in the boost headers, but those
> warnings are probably suppressed).

Of course the warning should only be emitted when such a
constructor/assignment is used.

Still, in my naive opinion, such a constructor is declared
(implicitly) in the class (sub_range).
The message at the point of use should be something similar to the
"instantiated from" message when there's an error inside a template.

Something like:

/usr/include/boost/range/sub_range.hpp:???: implicitly-declared ‘constexpr
boost::sub_range<const std::__cxx11::basic_string<char> >&)’ is

/usr/include/boost/range/sub_range.hpp:259:20: note: because REASONS

subra.cpp:7:6: note:   used when initializing argument 1 of ‘void func(srange)’

> But I agree that if the class is defined in a system header you can't
> change the code, so the warning is not very helpful. Please report a
> bug, https://gcc.gnu.org/bugs/

You can get very substantial performance improvements
by not doing the right thing. - Scott Meyers, An Effective C++11/14 Sampler
So if you're looking for a completely portable, 100% standards-conformat way
to get the wrong information: this is what you want. - Scott Meyers (C++TDaWYK)

More information about the Gcc mailing list