Opened 9 years ago

Closed 8 years ago

#9718 closed Bugs (fixed)

boost::container::string assignment operator problem

Reported by: Piotr Sulecki <piotr.sulecki@…> Owned by: Ion Gaztañaga
Milestone: To Be Determined Component: container
Version: Boost 1.53.0 Severity: Problem
Keywords: Cc:

Description

The following code compiles with std::string, but fails to with boost::container::string. The error message is:

stringtest.cpp: In function ‘int main()’:
stringtest.cpp:21:5: error: no match for ‘operator=’ (operand types are ‘Msg’ and ‘const Msg’)
   y = x; // ok with std::string, compilation error with boost::container::string
     ^
stringtest.cpp:21:5: note: candidate is:
stringtest.cpp:7:8: note: Msg& Msg::operator=(Msg&)
 struct Msg
        ^
stringtest.cpp:7:8: note:   no known conversion for argument 1 from ‘const Msg’ to ‘Msg&’

...which suggests the assignment operator generated for Msg takes only a Msg reference, not a const one.

Boost 1.53.0 under Cygwin64, compiled using g++ (GCC) 4.8.1.

#include <string>
#include <boost/container/string.hpp>

// using namespace std;
using namespace boost::container;

struct Msg
{
public:
  string msg;
};

int main()
{
  const string a("hello");
  string b;
  b = a; // ok

  const Msg x;
  Msg y;
  y = x; // ok with std::string, compilation error with boost::container::string
  return 0;
};

Change History (5)

comment:1 by viboes, 9 years ago

Component: Nonecontainer
Owner: set to Ion Gaztañaga

comment:2 by Piotr Sulecki <piotr.sulecki@…>, 9 years ago

Component: containerNone

Just checked: the code works ok when compiled in the C++11 mode (-std=c++11) but fails in the default mode (no -std specified, i.e. -std=c++03).

comment:3 by Ion Gaztañaga, 9 years ago

This is a well-known limitation of Boost.Move:

http://www.boost.org/doc/libs/1_55_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operator

However, it should be documented in the Container library as a known issue. I'll use this ticket for this.

You'll need to define the assignment operator in the struct to workaround the issue. It's a pain but there is no fix for that.

comment:4 by Piotr Sulecki <piotr.sulecki@…>, 9 years ago

Component: Nonecontainer

Sorry about the component change, it was not intentional. Reverting it.

comment:5 by Ion Gaztañaga, 8 years ago

Resolution: fixed
Status: newclosed

Documentation updated with this known issue in commit:

SHA-1: 9c582e906aa95fa5a6d2383c8d4e4065ebdce160

  • Documentation fixes:
  • allocator_traits was not properly placed in namespace boost::container
  • Fixed some typos
  • Added "Known Issues" section with move emulation problems.
Note: See TracTickets for help on using tickets.