2014-11-25 18 views
5

Đọc một số mã Tôi đã tìm thấy một lớp chỉ chấp nhận tham số C++ 11 nullptr_t mới làm tham số. Lớp học trông giống như lớp dưới đây.C++ nullptrt_t làm đối số trong một hàm tạo

Tôi có chính xác rằng điều duy nhất tôi có thể xây dựng một đối tượng bằng cách sử dụng độc quyền nullptr?

class CA { 
public: 
CA(nullptr_t) {} 
}; 
+2

Yes. Xem ví dụ [tham chiếu 'std :: nullptr_t' này] (http://en.cppreference.com/w/cpp/types/nullptr_t). –

+0

Bây giờ tôi tự hỏi nếu 'std :: nullpr_t()' là một biểu thức hợp lệ. Không thể thấy tại sao không, vì vậy đó sẽ là một lựa chọn khác. – MSalters

Trả lời

4

Tôi có đúng là điều duy nhất tôi có thể tạo đối tượng bằng cách sử dụng độc quyền nullptr không?

số này được bao phủ trong §4.10 [conv.ptr]:

Một con trỏ hằng rỗng của loại tách rời có thể được chuyển đổi sang một prvalue loại std::nullptr_t.

nơi một rỗng con trỏ hằng được định nghĩa như sau:

Một rỗng con trỏ hằng là một số nguyên chữ (2.14.2) với giá trị zero hoặc một prvalue loại std::nullptr_t.

Nói cách khác, nhà xây dựng của bạn có thể được gọi còn với literals số nguyên khác nhau có giá trị 0:

CA{ 0 }; 
CA{ 0u }; 
CA{ 0LL }; 
CA{ 0x0 }; 
2

Theo tài liệu:

std :: nullptr_t là kiểu của con trỏ null đen, nullptr.

Có nghĩa là có, bạn có thể xây dựng đối tượng này chỉ với nullptr hoặc một giá trị không thể thiếu tương ứng (như trong câu trả lời dưới đây giải thích). Kiểm tra this ví dụ vì nó hiển thị tình huống mà bạn cần.

+0

Xin chào. Cảm ơn. Có nó là đúng và bao gồm cả việc sử dụng giá trị '0' cho con trỏ null và 'NULL' (tín dụng cho PIOTR S. http://stackoverflow.com/users/3953764/piotr-s người đã xóa câu trả lời của nó..don không biết tại sao). –

+0

trong C++ 11 NULL vẫn còn (void *) 0 cho khả năng tương thích retro. Đó là lý do tại sao các nullptr chữ mới đã được giới thiệu. –

+0

@dau_sama: Không, và điều đó không bao giờ xảy ra. Trong mọi chuẩn C++, 'NULL' đã có một kiểu tích phân. Có thể là '0', có thể là' 0L', có thể là một vài điều khác về mặt lý thuyết, nhưng '(void *) 0' không phải là một loại không thể thiếu. – MSalters

6

Các quy định cụ thể tiêu chuẩn, tại §2.14.7.1, rằng:

Con trỏ đen là từ khóa nullptr. Đây là giá trị của loại std::nullptr_t. [Lưu ý: std::nullptr_t là một loại riêng biệt không phải là loại con trỏ cũng không phải là con trỏ đến loại thành viên; thay vào đó, một giá trị của loại này là một hằng số con trỏ null và có thể được chuyển đổi thành một giá trị con trỏ null hoặc giá trị con trỏ thành viên null. -endnote]

Các prvalue duy nhất của loại nullptr_tnullptr mà sau đó được chuyển đổi thành kiểu con trỏ khác theo các quy tắc quy định tại §4.10 và §4.11.

literals số nguyên khác có thể được chuyển đổi sang một giá trị kiểu std::nullptr_t theo §4.10.1:

Một con trỏ hằng null là một số nguyên chữ (2.14.2) với giá trị zero hoặc một prvalue loại std::nullptr_t.

Vì vậy, bạn có thể sử dụng ký tự đại diện có giá trị bằng 0 hoặc nullptr.

Cụ thể:

  • 0
  • 0u, 0U
  • 0l, 0L
  • 0ul, 0uL, 0Ul, 0UL
  • 0ll, 0LL
  • 0ull, 0uLL, 0ULL
  • nullptr
  • NULL

tôi có thể bị thiếu một số trường hợp, do đó rơi tự do để chính xác cho tôi.

Các vấn đề liên quan