Следующие два объявления, включающие автоматический тип возврата, работают одинаково?Если так, то почему? - PullRequest
0 голосов
/ 20 декабря 2018

Я запутался, почему книга, которую я читаю, говорит, что следующие два объявления имеют одинаковый эффект:

template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(b<a?a:b);

template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(true?a:b);

В первом объявлении тип возвращаемого значения max(a, b) может быть типомa или тип b.Во втором объявлении тип возвращаемого значения - тип a.Как два объявления могут иметь одинаковый эффект?

Вот отрывок, который я прочитал:

enter image description here

enter image description here

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Во втором объявлении типом возврата является тип a.

На чем основано это предположение?Я думаю, что это источник путаницы.Оцениваемый статический тип троичного выражения (или любого выражения) не зависит от какого-либо семантического анализа значений операндов, только от типов операндов.Типы всех трех троичных операндов одинаковы в обоих выражениях, поэтому выводимый тип одинаков.

Другими словами, тот факт, что условный операнд равен true, во время выполнения , приводящее к тому, что выражение оценивается как a, совершенно не имеет отношения к анализу и выводу статических типов.

0 голосов
/ 20 декабря 2018

Нет, но по другой причине.

Тип выражения является статической конструкцией.Это не зависит от значения его операндов.Если выражения верны, то b < a ? a : b, true ? a : b и false ? a : b имеют одинаковый тип, определенный из типов a и b через сложный набор правил, который занимает в стандартном документе около 1,5 страниц..

Они имеют разные эффекты SFINAE.Если вы передадите пару аргументов, которые на самом деле не поддерживают сравнение <, то первое объявление удалит себя из разрешения перегрузки, в то время как второе объявление с радостью примет аргументы, а затем вызовет серьезную ошибку при создании экземпляра тела функции.Это действительно имеет значение, только если у вас есть другая перегрузка max, которая может принять эти аргументы, или если у вас есть код, проверяющий правильность выражения, вызывающего max.

0 голосов
/ 20 декабря 2018

Как говорится в отрывке, тип max(a, b) - это общий тип из a и b, поскольку условный оператор (E1 ? E2 : E3) возвращает общий тип второго и третьегооперанды.

...