فهرست منبع

Make C++ string oneof field compatible with C++11

string oneof field was generated into "const ArenaStringPtr" field inside
"default_oneof_instance_" struct (of name "<class name>OneofInstance").

On the other hand, in C++11, const field of type with trivial default
constructor causes enclosing type's implicit default constructor to be deleted.

Since ArenaStringPtr has tirvial default constructor, this caused default
constructor of "default_oneof_instance_" struct to be deleted, making the
constructor call inside generated code invalid and fail to compile.
Nobuaki Sukegawa 11 سال پیش
والد
کامیت
2413cb57ef
2فایلهای تغییر یافته به همراه2 افزوده شده و 3 حذف شده
  1. 1 1
      src/google/protobuf/compiler/cpp/cpp_message.cc
  2. 1 2
      src/google/protobuf/compiler/cpp/cpp_string_field.cc

+ 1 - 1
src/google/protobuf/compiler/cpp/cpp_message.cc

@@ -1226,7 +1226,7 @@ GenerateDescriptorDeclarations(io::Printer* printer) {
       for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
         const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
         printer->Print("  ");
-        if (IsStringOrMessage(field)) {
+        if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
           printer->Print("const ");
         }
         field_generators_.get(field).GeneratePrivateMembers(printer);

+ 1 - 2
src/google/protobuf/compiler/cpp/cpp_string_field.cc

@@ -613,8 +613,7 @@ GenerateSwappingCode(io::Printer* printer) const {
 void StringOneofFieldGenerator::
 GenerateConstructorCode(io::Printer* printer) const {
   printer->Print(variables_,
-    "  const_cast< ::google::protobuf::internal::ArenaStringPtr*>("
-    "&$classname$_default_oneof_instance_->$name$_)->UnsafeSetDefault("
+    "  $classname$_default_oneof_instance_->$name$_.UnsafeSetDefault("
     "$default_variable$);\n");
 }