Mã sau có được xác định rõ trong C++ không? (*)Con trỏ tới thành viên dữ liệu của loại không đầy đủ
Tôi đang gặp khó khăn trong việc tìm ra vị trí cần xem ngay cả tiêu chuẩn và tìm kiếm trên web chưa bật lên bất kỳ điều gì cụ thể.
struct S;
struct T {
constexpr T() = default;
bool S::* a = nullptr;
int b = 42;
};
const T t{};
// Test. Compiled using: cl /W4 /WX /FAs filename.cpp
#include <stdlib.h>
int main() {
if (t.b != 42) abort();
}
Lý do tôi hỏi là vì nó hoạt động (hoặc có vẻ) với các phiên bản mới hơn của GCC và Clang (x86/x86_64), nhưng thất bại (**) với Visual Studio 2015 Update 2 và cập nhật 3 RC.
Trước khi báo cáo lỗi, tôi muốn chắc chắn rằng tôi không dựa vào hành vi không xác định hoặc chỉ không tìm kiếm đúng cụm từ.
Tôi cũng đã thử sử dụng /vmg
và /vmb
như được đề cập trong this post.
(*): Tôi chủ yếu quan tâm đến C++ 14 trở lên, nhưng tôi không thấy lý do nào mà câu trả lời sẽ không áp dụng cho C++ 11.
(**): Nếu mã được xác định rõ ràng, nó trông giống như một lỗi codegen, nơi nó không phải là phòng phân bổ cho con trỏ. Thay đổi struct S
thành struct S{}
dường như làm cho mã "hoạt động".
Chính xác bạn đang mong đợi mã sẽ làm gì? 'T' có phải chứa một con trỏ tới' S' không, và nếu vậy, tại sao nó không được viết bằng 'S * a = nullptr;'? – Xirema
Biên dịch [ở đây] (http://rextester.com/NFYP31324) và trên MSVS của riêng tôi năm 2015. Tôi có phiên bản 14.0.23107.0 D14REL – NathanOliver
@Xirema: 'T :: a' là một [con trỏ đến dữ liệu (bool) thành viên] (http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members) trong loại không hoàn chỉnh 'S'. @NathanOliver: Nó cũng biên dịch cho tôi, nhưng nó 'hủy bỏ khi được thực hiện. – user786653