public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/55977] New: [C++11] vector range construction imposes unnecessary conversion constraints
@ 2013-01-14 20:51 daniel.kruegler at googlemail dot com
  2013-01-14 22:13 ` [Bug libstdc++/55977] " redi at gcc dot gnu.org
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: daniel.kruegler at googlemail dot com @ 2013-01-14 20:51 UTC (permalink / raw)
  To: gcc-bugs


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55977

             Bug #: 55977
           Summary: [C++11] vector range construction imposes unnecessary
                    conversion constraints
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: daniel.kruegler@googlemail.com


The following code compiled with gcc 4.8.0 20130113 (experimental) using the
flags

-Wall -std=c++11 -pedantic

is rejected:

//-------------------------------------
#include <memory>
#include <utility>
#include <vector>
#include <iterator>
#include <iostream>

template <class T>
struct MyAllocator {
  std::allocator<T> base;
  typedef T value_type;
  MyAllocator() = default;
  template <class U>
  MyAllocator(const MyAllocator<U>& other) : base(other.base) {}
  T* allocate(std::size_t n) { return base.allocate(n); }
  void deallocate(T* p, std::size_t n) { return base.deallocate(p, n); }
  template <class U, class... Args>
  void construct(U* p, Args&&... args)
  {
     ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
  }
};

struct A {
private:
  friend class MyAllocator<A>;
  A(int value) : value(value) {}
  int value;
public:
  A() : value() {}
  int get() const { return value; }
};

int main()
{
  std::vector<A, MyAllocator<A>> v1;
  const int i = 1;
  v1.emplace_back(i); // OK
  std::vector<A, MyAllocator<A>> v2(std::istream_iterator<int>(std::cin), {});
// Error
}
//-------------------------------------

"[..]gcc\include\c++\4.8.0\bits\stl_vector.h||In instantiation of 'void
std::vector<_Tp, _Alloc>::_M_range_initialize(_InputIterator, _InputIterator,
std::input_iterator_tag) [with _InputIterator = std::istream_iterator<int>; _Tp
= A; _Alloc = MyAllocator<A>]':|
[..]gcc\include\c++\4.8.0\bits\stl_vector.h|1178|required from 'void
std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_InputIterator,
_InputIterator, std::__false_type) [with _InputIterator =
std::istream_iterator<int>; _Tp = A; _Alloc = MyAllocator<A>]'|
[..]gcc\include\c++\4.8.0\bits\stl_vector.h|396|required from 'std::vector<_Tp,
_Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&) [with
_InputIterator = std::istream_iterator<int>; <template-parameter-2-2> = void;
_Tp = A; _Alloc = MyAllocator<A>; std::vector<_Tp, _Alloc>::allocator_type =
MyAllocator<A>]'|
main.cpp|38|required from here|
main.cpp|26|error: 'A::A(int)' is private|
[..]gcc\include\c++\4.8.0\bits\stl_vector.h|1188|error: within this context"

The error is due to a call of push_back with an previous int->A conversion. 

Such an conversion from the iterator's value_type to the containers value_type
is not feasible. The specification of the corresponding constructor is
(indirectly) ruled by Table 100, expression X(i, j):

"Requires: T shall be EmplaceConstructible into X from *i."

Move/CopyConstructible or Convertible to value_type are not required.

Instead of invoking push_back this constructor should internally invoke the
equivalent of emplace_back.

The same problem also occurs for other standard containers such as std::list.


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-06-22 15:25 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-14 20:51 [Bug libstdc++/55977] New: [C++11] vector range construction imposes unnecessary conversion constraints daniel.kruegler at googlemail dot com
2013-01-14 22:13 ` [Bug libstdc++/55977] " redi at gcc dot gnu.org
2013-01-14 22:18 ` daniel.kruegler at googlemail dot com
2013-03-17 11:22 ` paolo.carlini at oracle dot com
2013-03-18 10:16 ` paolo at gcc dot gnu.org
2013-03-27 14:33 ` paolo.carlini at oracle dot com
2013-05-31 11:03 ` jakub at gcc dot gnu.org
2013-10-16  9:51 ` jakub at gcc dot gnu.org
2015-06-22 14:26 ` rguenth at gcc dot gnu.org
2015-06-22 15:25 ` redi at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).