Tại sao các mảng tài liệu tham khảo bất hợp pháp?


149

Các mã sau không biên dịch.

int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};

Tiêu chuẩn C ++ nói gì về điều này?

Tôi biết tôi có thể khai báo một lớp có chứa một tham chiếu, sau đó tạo một mảng của lớp đó, như được hiển thị bên dưới. Nhưng tôi thực sự muốn biết tại sao đoạn mã trên không biên dịch được.

struct cintref
{
    cintref(const int & ref) : ref(ref) {}
    operator const int &() { return ref; }
private:
    const int & ref;
    void operator=(const cintref &);
};

int main() 
{
  int a=1,b=2,c=3;
  //typedef const int &  cintref;
  cintref arr[] = {a,b,c,8};
}

Có thể sử dụng struct cintrefthay vì const int &mô phỏng một loạt các tài liệu tham khảo.


1
Ngay cả khi mảng là hợp lệ, việc lưu trữ giá trị '8' thô trong nó sẽ không hoạt động. Nếu bạn đã "intlink value = 8;", nó sẽ chết một cách khủng khiếp, bởi vì nó được dịch thành "const int & value = 8;". Một tham chiếu phải tham chiếu một biến.
Grant Peters

3
intlink value = 8;làm việc. kiểm tra nếu bạn không tin
Alexey Malistov

7
Như Alexey chỉ ra, việc liên kết một giá trị với tham chiếu const là hoàn toàn hợp lệ.
avakar

1
Những gì không làm việc là đó operator=. Tài liệu tham khảo không thể được nối lại. Nếu bạn thực sự muốn như vậy ngữ nghĩa - mặc dù tôi đã không đích thân tìm thấy một tình huống mà họ đang thực tế hữu ích - sau đó std::reference_wrappersẽ là cách để làm điều đó, vì nó thực sự lưu trữ một con trỏ nhưng cung cấp tài liệu tham khảo như operators và không cho phép reseating. Nhưng sau đó tôi chỉ cần sử dụng một con trỏ!
gạch dưới

1
Toán tử = là riêng tư và không được triển khai, còn gọi là gì trong C ++ 11 là = xóa.
Jimmy Hartzell

Câu trả lời:


148

Trả lời câu hỏi của bạn về tiêu chuẩn Tôi có thể trích dẫn Tiêu chuẩn C ++ §8.3.2 / 4 :

Sẽ không có tài liệu tham khảo cho tài liệu tham khảo, không có mảng tài liệu tham khảo và không có con trỏ đến tài liệu tham khảo.


32
Còn gì để nói nữa không?
polyglot

9
nên có các mảng tham chiếu cho cùng một lý do chúng ta có các mảng con trỏ, cùng thông tin nhưng xử lý khác nhau, không?
neu-rah

6
Nếu các nhà phát triển trình biên dịch đã quyết định, như một phần mở rộng, cho phép các mảng tham chiếu, thì nó có thành công không? Hoặc có một số vấn đề thực sự - có lẽ là mã mơ hồ - sẽ khiến nó quá khó hiểu khi định nghĩa phần mở rộng này?
Aaron McDaid

23
@AaronMcDaid Tôi nghĩ lý do thực sự - vốn vắng mặt một cách rõ rệt trong cuộc thảo luận tương tự & tương tự này - là nếu một người có một loạt các tài liệu tham khảo, làm thế nào người ta có thể phân biệt giữa địa chỉ của một yếu tố và địa chỉ của người giới thiệu? Sự phản đối ngay lập tức đối với 'Bạn không thể đặt một tham chiếu trong một mảng / thùng chứa / bất cứ điều gì' là bạn có thể đặt một structthành viên duy nhất là một tham chiếu. Nhưng sau đó, bằng cách đó, giờ đây bạn đã có cả một tham chiếu & một đối tượng cha để đặt tên ... điều đó có nghĩa là bạn có thể nói rõ ràng địa chỉ mà bạn muốn. Có vẻ hiển nhiên ... vậy tại sao không ai nói điều đó?
gạch dưới

95
@polyglot What more is there to say?Một lý do cho lý do tại sao ? Tôi hoàn toàn hiểu về Tiêu chuẩn, nhưng chỉ trích dẫn nó và cho rằng kết thúc cuộc thảo luận có vẻ như là một cách chắc chắn để tiêu diệt suy nghĩ phê phán của người dùng - cùng với bất kỳ tiềm năng nào để ngôn ngữ phát triển, ví dụ như vượt qua giới hạn của thiếu sót hoặc hạn chế nhân tạo. Có quá nhiều 'vì Tiêu chuẩn nói' ở đây - và không đủ 'và rất hợp lý để nói điều đó, vì những lý do thực tế sau đây'. Tôi không biết tại sao upvote chảy rất háo hức với câu trả lời mà chỉ nói cái trước mà không cố gắng khám phá cái sau.
gạch dưới

64

Tài liệu tham khảo không phải là đối tượng. Họ không có kho lưu trữ của riêng họ, họ chỉ tham chiếu các đối tượng hiện có. Vì lý do này, không có ý nghĩa gì khi có các mảng tham chiếu.

Nếu bạn muốn một đối tượng trọng lượng nhẹ tham chiếu đến một đối tượng khác thì bạn có thể sử dụng một con trỏ. Bạn sẽ chỉ có thể sử dụng một structthành viên tham chiếu làm đối tượng trong mảng nếu bạn cung cấp khởi tạo rõ ràng cho tất cả các thành viên tham chiếu cho tất cả các structtrường hợp. Tài liệu tham khảo không thể được mặc định initalized.

Chỉnh sửa: Như jia3ep lưu ý, trong phần tiêu chuẩn về khai báo có một lệnh cấm rõ ràng đối với mảng tham chiếu.


6
Các tài liệu tham khảo giống nhau về bản chất là các con trỏ liên tục, và do đó chúng chiếm một số bộ nhớ (lưu trữ) để trỏ đến một cái gì đó.
inazaruk

7
Không cần thiết. Trình biên dịch có thể tránh lưu trữ địa chỉ, nếu đó là một tham chiếu đến đối tượng cục bộ.
EFraim

4
Không cần thiết. Tài liệu tham khảo trong các cấu trúc thường chiếm một số lưu trữ. Tài liệu tham khảo địa phương thường không. Dù bằng cách nào, theo nghĩa tiêu chuẩn nghiêm ngặt, các tài liệu tham khảo không phải là đối tượng và (điều này là mới đối với tôi) các tài liệu tham khảo có tên không thực sự là các biến .
CB Bailey

26
Có, nhưng đây là một chi tiết thực hiện. Một đối tượng trong mô hình C ++ là một vùng lưu trữ được gõ. Một tham chiếu rõ ràng không phải là một đối tượng và không có gì đảm bảo rằng nó chiếm dung lượng lưu trữ trong bất kỳ bối cảnh cụ thể nào.
CB Bailey

9
Nói theo cách này: bạn có thể có cấu trúc không có gì ngoài 16 lượt giới thiệu cho foo và sử dụng nó theo cách chính xác giống như tôi muốn sử dụng mảng ref của tôi - ngoại trừ việc bạn không thể lập chỉ mục vào 16 tham chiếu foo . Đây là một ngôn ngữ mụn cóc IMHO.
greggo

28

Đây là một cuộc thảo luận thú vị. Rõ ràng các mảng giới thiệu là hoàn toàn bất hợp pháp, nhưng IMHO lý do tại sao không đơn giản như nói 'chúng không phải là đối tượng' hoặc 'chúng không có kích thước'. Tôi đã chỉ ra rằng bản thân các mảng không phải là các đối tượng chính thức trong C / C ++ - nếu bạn phản đối điều đó, hãy thử khởi tạo một số lớp mẫu stl bằng cách sử dụng một mảng làm tham số mẫu 'lớp' và xem điều gì sẽ xảy ra. Bạn không thể trả lại chúng, gán chúng, chuyển chúng dưới dạng tham số. (một tham số mảng được coi là một con trỏ). Nhưng nó là hợp pháp để tạo ra các mảng của mảng. Các tham chiếu có một kích thước mà trình biên dịch có thể và phải tính toán - bạn không thể sizeof () một tham chiếu, nhưng bạn có thể tạo một cấu trúc không chứa gì ngoài các tham chiếu. Nó sẽ có kích thước đủ để chứa tất cả các con trỏ thực hiện các tham chiếu. Bạn có thể'

struct mys {
 int & a;
 int & b;
 int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs.a += 3  ;  // add 3 to ivar1

Trong thực tế, bạn có thể thêm dòng này vào định nghĩa struct

struct mys {
 ...
 int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};

... và bây giờ tôi có một cái gì đó trông RẤT NHIỀU như một loạt các ref:

int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs[1] = my_refs[2]  ;  // copy arr[12] to ivar2
&my_refs[0];               // gives &my_refs.a == &ivar1

Bây giờ, đây không phải là một mảng thực sự, nó là một quá tải toán tử; chẳng hạn, nó sẽ không làm những thứ mà mảng thường làm như sizeof (mảng) / sizeof (Array [0]). Nhưng nó thực hiện chính xác những gì tôi muốn một loạt các tài liệu tham khảo để làm, với C ++ hoàn toàn hợp pháp. Ngoại trừ (a) thật khó để thiết lập hơn 3 hoặc 4 phần tử và (b) đó là thực hiện một phép tính bằng cách sử dụng một nhóm ?: Có thể được thực hiện bằng cách lập chỉ mục (không phải với lập chỉ mục ngữ nghĩa tính toán con trỏ C thông thường , nhưng dù sao chỉ mục). Tôi muốn thấy một loại 'tham chiếu' rất hạn chế có thể thực sự làm điều này. Tức là một mảng các tài liệu tham khảo sẽ không được coi là một mảng chung của những thứ là tài liệu tham khảo, mà nó sẽ là một 'tham chiếu' mới thực hiện với các mẫu).

điều này có thể sẽ hoạt động, nếu bạn không bận tâm đến loại khó chịu này: recast '* this' dưới dạng một mảng của int * 'và trả về một tham chiếu được tạo từ một: (không được đề xuất, nhưng nó cho thấy cách' mảng 'thích hợp sẽ làm việc):

 int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }

1
Bạn có thể làm điều này trong C ++ 11 std::tuple<int&,int&,int&> abcref = std::tie( a,b,c)- tạo ra một "mảng" các tham chiếu chỉ có thể được lập chỉ mục bởi các hằng số thời gian biên dịch bằng cách sử dụng std :: get. Nhưng bạn không thể làm được std::array<int&,3> abcrefarr = std::tie( a,b,c). Có lẽ có một cách để làm điều đó mà tôi không biết. Dường như với tôi rằng có phải là một cách để viết một chuyên môn hóa của std::array<T&,N>có thể làm được điều này - và do đó một hàm std::tiearray(...)trả về một ví dụ (hoặc cho phép std::array<T&,N>chấp nhận initializer chứa địa chỉ = {& v1, & v2 vv})
greggo

Đề xuất của bạn là ngớ ngẩn (IMO) và dòng cuối cùng của bạn giả sử một int có thể giữ một con trỏ (thường là sai, ít nhất là nơi tôi làm việc). Nhưng đây là câu trả lời duy nhất ở đây với một lý do hợp pháp cho lý do tại sao các mảng tài liệu tham khảo bị cấm, vì vậy +1
Nemo

@Nemo nó không thực sự có ý định như một đề xuất, nhưng chỉ để minh họa rằng chức năng của một thứ như vậy không phải là vô lý trên khuôn mặt của nó. Tôi lưu ý trong bình luận cuối cùng của tôi rằng c ++ có những thứ đến gần. Ngoài ra, dòng cuối cùng mà bạn đề cập đến giả định rằng bộ nhớ thực hiện tham chiếu đến int có thể được đặt bí danh là con trỏ tới int - cấu trúc chứa các tham chiếu, không phải ints - và điều đó có xu hướng đúng. Tôi không khẳng định nó di động (hoặc thậm chí an toàn với các quy tắc 'hành vi không xác định'). nó có nghĩa là để minh họa cách lập chỉ mục có thể được sử dụng dưới mui xe để tránh tất cả?:
greggo

Đủ công bằng. Nhưng tôi nghĩ ý tưởng này là "vô lý trên khuôn mặt của nó", và đây chính là lý do tại sao các mảng tài liệu tham khảo không được phép. Một mảng là, đầu tiên và quan trọng nhất, là một container. Tất cả các container cần một kiểu lặp để áp dụng các thuật toán tiêu chuẩn. Kiểu lặp cho "mảng T" thường là "T *". Điều gì sẽ là kiểu lặp cho một mảng các tham chiếu? Số lượng hack ngôn ngữ cần có để xử lý tất cả các vấn đề này là vô lý đối với một tính năng cơ bản vô dụng. Trên thực tế có lẽ tôi sẽ biến điều này thành một câu trả lời của riêng mình :-)
Nemo

@Nemo Nó không cần phải là một phần của ngôn ngữ cốt lõi, vì vậy kiểu lặp là 'tùy chỉnh' không phải là vấn đề lớn. Tất cả các loại container khác nhau có loại lặp. Trong trường hợp này, iterator, đã hủy đăng ký, sẽ tham chiếu các objs đích, không phải các ref trong mảng, hoàn toàn phù hợp với hành vi của mảng. Nó vẫn có thể yêu cầu một chút hành vi C ++ mới để hỗ trợ làm mẫu Mẫu rất đơn giản std::array<T,N>, dễ xác định trong mã ứng dụng, không được thêm vào std :: cho đến khi c ++ 11, có lẽ vì nó không có cách nào để không có cách này đó = {1,2,3};có phải là 'hack ngôn ngữ' không?
greggo

28

Nhận xét để chỉnh sửa của bạn:

Giải pháp tốt hơn là std::reference_wrapper.

Chi tiết: http://www.cplusplus.com/reference/feftal/reference_wrapper/

Thí dụ:

#include <iostream>
#include <functional>
using namespace std;

int main() {
    int a=1,b=2,c=3,d=4;
    using intlink = std::reference_wrapper<int>;
    intlink arr[] = {a,b,c,d};
    return 0;
}

Xin chào, điều này đã được nêu lại vào 09. Mẹo tìm các bài đăng mới hơn :)
Stígandr

9
Bài viết đã cũ nhưng không phải ai cũng biết về giải pháp với Reference_wrapper. Mọi người cần đọc di chuyển về STL và STDlib của C ++ 11.
Youw 22/11 '

Điều này đưa ra một liên kết và mã mẫu, thay vì chỉ đề cập đến tên của lớp reference_wrapper.
David Stone

12

Một mảng được chuyển đổi hoàn toàn thành một con trỏ và tham chiếu con trỏ là bất hợp pháp trong C ++


11
Đúng là bạn không thể có một con trỏ tới một tham chiếu, nhưng đây không phải là lý do mà bạn không thể có một loạt các tham chiếu. Thay vào đó, cả hai đều là triệu chứng của thực tế là các tài liệu tham khảo không phải là đối tượng.
Richard Corden

1
Một cấu trúc có thể không chứa gì ngoài các tham chiếu và nó sẽ có kích thước tỷ lệ thuận với số lượng của chúng. Nếu bạn đã có một mảng 'ref', việc chuyển đổi mảng thành con trỏ bình thường sẽ không có ý nghĩa gì, vì 'con trỏ để tham chiếu' sẽ không có ý nghĩa. nhưng sẽ tốt hơn nếu chỉ sử dụng mảng [i], theo cách tương tự như st.ref khi 'st' là một cấu trúc có chứa một ref. Hừm. Nhưng & Array [0] sẽ cung cấp địa chỉ của đối tượng được tham chiếu đầu tiên và & Array [1] - & Array [0] sẽ không giống với & Array [2] - & Array [1] - nó sẽ tạo ra nhiều sự kỳ lạ.
greggo

11

Cho int& arr[] = {a,b,c,8};, là sizeof(*arr)gì?

Ở mọi nơi khác, một tài liệu tham khảo được coi là đơn giản là chính nó, vì vậy sizeof(*arr)đơn giản nên có sizeof(int). Nhưng điều này sẽ làm cho số học con trỏ mảng trên mảng này sai (giả sử rằng các tham chiếu không có cùng độ rộng là ints). Để loại bỏ sự mơ hồ, nó bị cấm.


Vâng. Bạn không thể có một mảng của một cái gì đó trừ khi nó có kích thước. Kích thước của một tài liệu tham khảo là gì?
David Schwartz

4
@DavidSchwartz Tạo structthành viên duy nhất có tham chiếu đó và tìm hiểu ..?
gạch dưới

3
Đây phải là câu trả lời được chấp nhận, không phải là câu trả lời ngu ngốc mà chỉ đơn giản là ném tiêu chuẩn tại OP.
Tyson Jacobs

Có lẽ có một lỗi đánh máy. "Giả sử rằng các tham chiếu không có cùng độ rộng là ints" nên "giả sử rằng các tham chiếu không có cùng độ rộng như ints". Thay đổi để làm .
zhenguoli

Nhưng chờ đã, theo logic này, bạn không thể có các biến thành viên tham chiếu.
Tyson Jacobs

10

Bởi vì giống như nhiều người đã nói ở đây, tài liệu tham khảo không phải là đối tượng. chúng chỉ đơn giản là bí danh. Đúng một số trình biên dịch có thể thực hiện chúng như các con trỏ, nhưng tiêu chuẩn không bắt buộc / chỉ định điều đó. Và bởi vì tài liệu tham khảo không phải là đối tượng, bạn không thể chỉ ra chúng. Lưu trữ các phần tử trong một mảng có nghĩa là có một số loại địa chỉ chỉ mục (nghĩa là chỉ đến các phần tử tại một chỉ mục nhất định); và đó là lý do tại sao bạn không thể có các mảng tham chiếu, bởi vì bạn không thể trỏ đến chúng.

Sử dụng boost :: Reference_wrapper hoặc boost :: tuple thay thế; hoặc chỉ con trỏ.


5

Tôi tin rằng câu trả lời rất đơn giản và nó phải được thực hiện với các quy tắc ngữ nghĩa của các tham chiếu và cách các mảng được xử lý trong C ++.

Tóm lại: Các tài liệu tham khảo có thể được coi là các cấu trúc không có hàm tạo mặc định, vì vậy tất cả các quy tắc tương tự đều được áp dụng.

1) Về mặt ngữ nghĩa, tài liệu tham khảo không có giá trị mặc định. Tài liệu tham khảo chỉ có thể được tạo ra bằng cách tham khảo một cái gì đó. Tài liệu tham khảo không có giá trị để thể hiện sự vắng mặt của tài liệu tham khảo.

2) Khi phân bổ một mảng có kích thước X, chương trình sẽ tạo ra một tập hợp các đối tượng được khởi tạo mặc định. Vì tham chiếu không có giá trị mặc định, việc tạo một mảng như vậy là bất hợp pháp về mặt ngữ nghĩa.

Quy tắc này cũng áp dụng cho các cấu trúc / lớp không có hàm tạo mặc định. Mẫu mã sau không biên dịch:

struct Object
{
    Object(int value) { }
};

Object objects[1]; // Error: no appropriate default constructor available

1
Bạn có thể tạo một mảng Object, bạn chỉ cần đảm bảo khởi tạo tất cả : Object objects[1] = {Object(42)};. Trong khi đó, bạn không thể tạo một loạt các tài liệu tham khảo, ngay cả khi bạn khởi tạo tất cả chúng.
Anton3

4

Bạn có thể khá gần với cấu trúc mẫu này. Tuy nhiên, bạn cần khởi tạo với các biểu thức là con trỏ tới T, thay vì T; và do đó, mặc dù bạn có thể dễ dàng tạo một 'fake_constref_array' tương tự, bạn sẽ không thể liên kết nó với các giá trị như được thực hiện trong ví dụ của OP ('8');

#include <stdio.h>

template<class T, int N> 
struct fake_ref_array {
   T * ptrs[N];
  T & operator [] ( int i ){ return *ptrs[i]; }
};

int A,B,X[3];

void func( int j, int k)
{
  fake_ref_array<int,3> refarr = { &A, &B, &X[1] };
  refarr[j] = k;  // :-) 
   // You could probably make the following work using an overload of + that returns
   // a proxy that overloads *. Still not a real array though, so it would just be
   // stunt programming at that point.
   // *(refarr + j) = k  
}

int
main()
{
    func(1,7);  //B = 7
    func(2,8);     // X[1] = 8
    printf("A=%d B=%d X = {%d,%d,%d}\n", A,B,X[0],X[1],X[2]);
        return 0;
}

-> A = 0 B = 7 X = {0,8,0}


2

Một đối tượng tham chiếu không có kích thước. Nếu bạn viết sizeof(referenceVariable), nó sẽ cung cấp cho bạn kích thước của đối tượng được tham chiếu bởi referenceVariable, không phải của tham chiếu. Nó không có kích thước của riêng nó, đó là lý do tại sao trình biên dịch không thể tính được kích thước của mảng sẽ yêu cầu.


3
Nếu vậy thì làm thế nào một trình biên dịch có thể tính toán kích thước của một cấu trúc chỉ chứa một ref?
Juster

Trình biên dịch biết kích thước vật lý của một tham chiếu - nó giống như một con trỏ. Trên thực tế, các tài liệu tham khảo là con trỏ được tôn vinh về mặt ngữ nghĩa. Sự khác biệt giữa con trỏ và tham chiếu là các tham chiếu có khá nhiều quy tắc ngữ nghĩa được đặt trên chúng để giảm số lượng lỗi bạn có thể tạo so với con trỏ.
Kristupas A.

2

Khi bạn lưu trữ một cái gì đó trong một mảng, kích thước của nó cần phải được biết (vì việc lập chỉ mục mảng phụ thuộc vào kích thước). Theo tiêu chuẩn C ++ Không xác định được liệu tham chiếu có yêu cầu lưu trữ hay không, do đó, việc lập chỉ mục một mảng các tham chiếu sẽ không thể thực hiện được.


1
Nhưng bằng cách đưa tài liệu tham khảo nói vào struct, một cách kỳ diệu, mọi thứ trở nên cụ thể, được xác định rõ, được bảo đảm và có kích thước xác định. Tại sao, do đó, sự khác biệt dường như hoàn toàn nhân tạo này tồn tại?
gạch dưới

... tất nhiên, nếu người ta thực sự bắt đầu nghĩ về những gì gói struct, thì một số câu trả lời tốt có thể bắt đầu tự đề xuất - nhưng với tôi, không ai đã làm như vậy, mặc dù đây là một trong những thách thức trước mắt đối với tất cả những điều phổ biến lý do cho lý do tại sao bạn không thể sử dụng refs không được bao bọc.
gạch dưới

2

Chỉ để thêm vào tất cả các cuộc trò chuyện. Do các mảng yêu cầu các vị trí bộ nhớ liên tiếp để lưu trữ mục, vì vậy nếu chúng ta tạo một mảng các tham chiếu thì không đảm bảo rằng chúng sẽ ở vị trí bộ nhớ liên tiếp nên việc truy cập sẽ là một vấn đề và do đó chúng ta thậm chí không thể áp dụng tất cả các hoạt động toán học trên mảng.


Hãy xem xét đoạn mã dưới đây từ câu hỏi ban đầu: int a = 1, b = 2, c = 3; int & Array [] = {a, b, c, 8}; Có rất ít khả năng a, b, c sẽ cư trú tại vị trí bộ nhớ liên tiếp.
Amit Kumar

Đó là xa vấn đề chính với khái niệm giữ tài liệu tham khảo trong một container.
gạch dưới

0

Hãy xem xét một loạt các con trỏ. Một con trỏ thực sự là một địa chỉ; Vì vậy, khi bạn khởi tạo mảng, bạn đang nói với máy tính một cách tương tự, "phân bổ khối bộ nhớ này để giữ các số X này (là địa chỉ của các mục khác)." Sau đó, nếu bạn thay đổi một trong những con trỏ, bạn chỉ thay đổi những gì nó trỏ đến; nó vẫn là một địa chỉ số mà chính nó đang ngồi ở cùng một chỗ.

Một tài liệu tham khảo tương tự như một bí danh. Nếu bạn đã khai báo một loạt các tài liệu tham khảo, về cơ bản bạn sẽ nói với máy tính, "phân bổ đốm bộ nhớ vô định hình này bao gồm tất cả các mục khác nhau nằm rải rác xung quanh."


1
Tại sao, sau đó, làm cho một structthành viên duy nhất là kết quả tham chiếu trong một cái gì đó hoàn toàn hợp pháp, có thể dự đoán và không vô định hình? Tại sao người dùng phải bọc một tài liệu tham khảo cho nó để có được sức mạnh có khả năng mảng, hoặc nó chỉ là một hạn chế nhân tạo? IMO không có câu trả lời đã trực tiếp giải quyết điều này. Tôi giả sử phản bác là 'Đối tượng bao bọc đảm bảo bạn có thể sử dụng ngữ nghĩa giá trị, dưới dạng đối tượng bao bọc, do đó, nó đảm bảo bạn có thể có các đảm bảo về giá trị, vì nó sẽ phân biệt giữa yếu tố và địa chỉ trọng tài' ... Đó có phải ý của bạn?
gạch dưới

-2

Trên thực tế, đây là một hỗn hợp của cú pháp C và C ++.

Bạn nên hoặc là sử dụng mảng C tinh khiết, mà không thể được tài liệu tham khảo, vì tài liệu tham khảo là một phần của C ++ chỉ. Hoặc bạn đi theo cách C ++ và sử dụng std::vectorhoặc std::arraylớp cho mục đích của bạn.

Đối với phần được chỉnh sửa: Mặc dù structlà một phần tử từ C, bạn xác định hàm xây dựng và hàm toán tử, làm cho nó trở thành C ++ class. Do đó, của bạnstruct sẽ không biên dịch trong C thuần túy!


Ý bạn là sao? std::vectorhoặc std::arraykhông thể chứa tài liệu tham khảo. Tiêu chuẩn C ++ khá rõ ràng rằng không có container nào có thể.
gạch dưới
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.