Не вызывает ли std :: piecewise_construct нарушение ODR?

std :: piecewise_construct , определенный в , имеет внутреннюю привязку, поскольку объявлен constexpr . Интересно, может ли использование std :: piecewise_construct в заголовке нарушать ODR. Например:

a.hpp

#include 
#include 

struct point
{
    point(int x, int y)
      : x(x), y(y)
    {}

    int x, y;
};

inline std::pair f(int x1, int y1, int x2, int y2)
{
    return {
        std::piecewise_construct,
        std::forward_as_tuple(x1, y1), std::forward_as_tuple(x2, y2)
    };
}

единица перевода 1

#include "a.hpp"

единица трансляции 2

#include "a.hpp"

std :: piecewise_construct в f в TU 1 относится к другому объект, чем в f в TU 2. Я подозреваю, что f нарушает ODR.

N3290 (вероятно, ISO / IEC 14882: 2011 также) говорит, что следующий случай является исключением из ODR в 3.2 / 5:

имя может относиться к константному объекту с внутренней связью или без нее, если объект имеет один и тот же тип литерала во всех определениях D, и объект инициализируется постоянным выражением (5.19), и используется значение (но не адрес) объекта, и объект имеет одно и то же значение во всех определениях D;

f удовлетворяет почти всем требованиям, но «используется значение (но не адрес) объекта» мне кажется неоднозначным.Верно, что std :: piecewise_construct_t не имеет состояния, но вызов кусочного конструктора std :: pair включает вызов неявно объявленного конструктора копирования для std :: piecewise_construct_t , аргумент которого const std :: piecewise_construct_t & . Адрес ведь «используется»?

Я очень озадачен.

Ссылка: http://lists.boost.org/Archives/boost/2007/06/123353.php

24
задан Deduplicator 7 July 2018 в 02:52
поделиться

1 ответ

Похоже, что у вас уже есть свой ответ в этой рассылке. Да, по моему мнению, это неопределенное поведение или, по крайней мере, недостаточно четкое определенное поведение.

См. это обсуждение usenet для того же самого обсуждаемого вопроса.

6
ответ дан 29 November 2019 в 00:30
поделиться
Другие вопросы по тегам:

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