этой статье
Raymond Chen, выражение Ternary не является кандидатом на копию Elision. < /p>
Проблема с тщательным Правило для тройных выражений заключается в том, что
Результат инициализируется из < /em> ветви выбранного тройного. Сделал еще несколько тестирования: < /p>
Следующий код, измененный из блога
raymond Chen,
действительно отвергается всеми тремя компиляторами: < /p>
Код: Выделить всё
#include
#include
#include
struct WidgetBase
{
// local mode
WidgetBase() {};
// remote mode
WidgetBase(std::string const& server)
:m_server(server)
{
std::cout
Godbolt < /p>
Clang: error: call to implicitly-deleted copy constructor of 'WidgetBase' note: copy constructor of 'WidgetBase' is implicitly
MSVC: error C2280: 'WidgetBase::WidgetBase(const WidgetBase &)': attempting to reference a deleted function
deleted because field 'm_mutex' has a deleted copy constructor
gcc: error: use of deleted function 'std::mutex::mutex(const std::mutex&)'
< /code>
Тем не менее, GCC и Clang принимают следующий код, но MSVC не: < /p>
struct Widget2
{
WidgetBase m_wb;
Widget2(WidgetOptions const& options) :
m_wb(
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server))
{
}
};
int main() {
WidgetOptions options{ false ,"123" };
[[maybe_unused]] WidgetBase wb1 =
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server);
options.server = "456";
[[maybe_unused]] WidgetBase wb2(
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server));
}
< /code>
Godbolt < /p>
If I add a move constructor to WidgetBaseGodbolt < /p>
Есть еще одна особенно странная вещь: элемент struct, кажется, влияет на MSVC Elision или нет! class = "lang-cpp prettyprint-override">struct WidgetBase
{
// local mode
WidgetBase() {};
// remote mode
WidgetBase(std::string const& server)
//removed :m_server(server)
{
std::cout
Итак, когда стандарт разрешает копию Elision для тройного оператора? Когда можно определить, что копия не существует?
Подробнее здесь: https://stackoverflow.com/questions/797 ... py-elision
Мобильная версия