'std :: piecewise_construct', được định nghĩa trong tiện ích < >, có liên kết nội bộ vì nó được khai báo constexpr. Tôi tự hỏi, nếu sử dụng 'std :: piecewise_construct' trong một tiêu đề có thể vi phạm ODR. Ví dụ:Không std :: piecewise_construct gây ra vi phạm ODR?
// a.hpp
#include <utility>
#include <tuple>
struct point
{
point(int x, int y)
: x(x), y(y)
{}
int x, y;
};
inline std::pair<point, point> 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)
};
}
// translation unit 1
#include "a.hpp"
// translation unit 2
#include "a.hpp"
Các 'std :: piecewise_construct' trong 'f' trong TU 1 đề cập đến một đối tượng khác nhau hơn so với trong 'f' trong TU 2. Tôi nghi ngờ 'f' vi phạm ODR.
N3290 (có thể là ISO/IEC 14882: 2011 cũng) cho biết trường hợp sau đây là một ngoại lệ của ODR, trong 3,2/5:
một tên có thể tham khảo một đối tượng const với nội hoặc không có mối liên hệ nếu đối tượng có cùng kiểu chữ trong tất cả các định nghĩa của D và đối tượng được khởi tạo với một biểu thức không đổi (5.19) và giá trị (nhưng không phải địa chỉ) của đối tượng được sử dụng và đối tượng có cùng giá trị trong tất cả định nghĩa của D;
'f' đáp ứng hầu hết các yêu cầu, nhưng "giá trị (nhưng không phải địa chỉ) của đối tượng được sử dụng" có vẻ mơ hồ đối với tôi. Đúng là 'std :: piecewise_construct_t' không có trạng thái, nhưng cuộc gọi của hàm khởi tạo piecewise của 'std :: pair' liên quan đến cuộc gọi của hàm tạo bản sao được khai báo ngầm của 'std :: piecewise_construct_t', đối số của nó là 'const std :: piecewise_construct_t & '. Địa chỉ được "sử dụng", phải không?
Tôi rất bối rối.
Tham chiếu: http://lists.boost.org/Archives/boost/2007/06/123353.php
+1 (Tôi nghĩ) cho một câu hỏi vẫn còn có tôi mà không có một đầu mối sau 2 phút – sehe
Đây không phải là vấn đề tương tự với 'std :: cout'? –
@Kerrek 'std :: cout' không được xác định nhiều lần. Nó chỉ được khai báo trong các tiêu đề tương ứng của nó. –