в любых ситуациях: инициализировать массивы, агрегаты или вызывать определенные пользователем конструкторы. Фактическая формулировка «равномерная инициализация» на самом деле отсутствует в FDIS как таковой, но если вы прочитаете раздел об инициализации (8.5), вы увидите, что все потребности инициализации могут быть удовлетворены некоторой формой фигурных скобок.

тим, у нас есть следующий код:

#include <iostream>
#include <string>

struct A
{
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
  A(A&&) { std::cout << "Move" << std::endl; }
  std::string s;
};

struct B
{
  A a;
};

int main()
{
  B{A()};
}

Здесь я считаю, что структураA не является агрегатом, так как имеет как нетривиальные конструкторы, так иstd::string член, который я предполагаю, не является совокупным. Это, вероятно, означает, чтоB тоже не агрегат.

Тем не менее, я могу агрегировать инициализацию B. Кроме того, это можно сделать без вызова ни конструктора копирования, ни перемещения (например, C ++ 0x GCC 4.5.1 наideone).

Такое поведение кажется полезной оптимизацией, особенно для составления больших типов стеков, у которых нет дешевых перемещений.

У меня такой вопрос: когда такая сортировка инициализации действительна в C ++ 0x?

Изменить + следующий вопрос:

DeadMG ниже ответил со следующим:

Это не агрегатная инициализация вообще, это равномерная инициализация, которая в основном в этом случае означает вызов конструктора, и, скорее всего, нет копирования или перемещения выполняется RVO и NRVO.

Обратите внимание, что когда я меняюB к следующему:

struct B
{
  A a;
  B(const A& a_) : a(a_) {}
  B(A&& a_) : a(std::move(a_)) {}
};

Ход выполнен.

Итак, если это просто равномерная инициализация и просто вызов конструктора и ничего особенного, то как мне написать конструктор, позволяющий исключить движение?

Или GCC просто не исключает этот шаг, если он действителен, и если да, есть ли параметр компилятора и оптимизации, который исключит этот шаг?

Ответы на вопрос(2)

Ваш ответ на вопрос