std :: piecewise_construct
, определенный в constexpr
. Интересно, может ли использование std :: piecewise_construct
в заголовке нарушать ODR. Например:
#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)
};
}
#include "a.hpp"
#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
Похоже, что у вас уже есть свой ответ в этой рассылке. Да, по моему мнению, это неопределенное поведение или, по крайней мере, недостаточно четкое определенное поведение.
См. это обсуждение usenet для того же самого обсуждаемого вопроса.