Почему {} работает while () при инициализации атомарного объекта здесь? [Дубликат]

Вот пример кода, который включает в себя легенду, если это интересно.

# First create an empty plot.
plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), 
     xlab = "log transformed coverage", ylab = "frequency")

# Create a list of 22 colors to use for the lines.
cl <- rainbow(22)

# Now fill plot with the log transformed coverage data from the
# files one by one.
for(i in 1:length(data)) {
    lines(density(log(data[[i]]$coverage)), col = cl[i])
    plotcol[i] <- cl[i]
}
legend("topright", legend = c(list.files()), col = plotcol, lwd = 1,
       cex = 0.5)
6
задан M.M 9 September 2015 в 02:37
поделиться

1 ответ

Начиная с последнего официального стандарта, C ++ 14, ваша первая инициализация не является двусмысленной. [over.match.list]:

Поскольку не существует конструкторов-списков инициализаторов, мы вводим «вторую фазу». А теперь рассмотрим [over.best.ics] / 4:

Наш элемент {0}. Следовательно, это запрещает (определяемое пользователем) преобразование {0} -> A для конструктора копирования. Ясно, что это не применяется, если мы не находимся во второй фазе [over.match.list], поэтому для вашего примера с B c({0}) не выполняется инициализация списка для c и оба конструктора рассматриваются.


CWG issue 1467

Первая инициализация в настоящее время столь же неоднозначна, как и вторая. Компиляторы просто еще не реализовали CWG # 1467 - его разрешение удалено из пункта пули (4.5), приведенное выше. См. # 2076 , в котором предлагается вернуться к изменению:

Разрешение issue 1467 сделало некоторые правдоподобные конструкции плохо сформированными. Например,

struct A { A(int); };
struct B { B(A); };
B b{{0}};

Это теперь неоднозначно, потому что текст, запрещающий определенные пользователем преобразования для конструкторов копирования и перемещения B, был удален из пункта 13.3.3.1 [over.best.ics] 4.

«Текст» - это упомянутая выше маркерная точка. Ричард Смит предлагает следующую формулировку:

Для типов, отличных от класса, мы разрешаем инициализацию из списка отдельных элементов для выполнения копии только в том случае, если элемент внутри списка сам по себе не является списком (13.3 .3.1.5 [over.ics.list] bullet 9.1). Аналогичным правилом для этого случая было бы добавить обратно маркер в пункт 13.3.3.1 [over.best.ics], но только в том случае, когда инициализатор сам является списком инициализаторов:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; вторая фаза 13.3.1.7 [over.match.list], когда список инициализаторов имеет ровно один & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ; элемент, который сам является списком инициализаторов, где целью является первый параметр конструктора & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp ;, и преобразование равно X ссылка на (возможно, cv-qualified) X,

Поскольку инициализатор {0} сам является списком инициализаторов, эта точка маркера сделает вашу первую инициализацию хорошо сформированной.

8
ответ дан Columbo 21 August 2018 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: