![](/img/trans.png)
[英]clang++ vs g++ constexpr difference with out of bound reference
[英]Conversions to arrays of unknown bound: g++ vs. clang++
注意:這是這個問題的后續問題。
示例代碼(t334.cpp):
typedef int T0;
typedef T0 T1[];
typedef T1* T2[];
T1 x1 = { 13 };
T2 x2 = { &x1 };
調用:
$ g++ t334.cpp -std=c++11 -pedantic -Wall -Wextra -c
t334.cpp:6:11: warning: conversions to arrays of unknown bound are only available with ‘-std=c++20’ or ‘-std=gnu++20’ [-Wpedantic]
6 | T2 x2 = { &x1 };
| ^~~
$ clang++ t334.cpp -std=c++11 -pedantic -Wall -Wextra -c
t334.cpp:6:11: error: cannot initialize an array element of type 'T1 *' (aka 'T0 (*)[]') with an rvalue of type 'T0 (*)[1]'
T2 x2 = { &x1 };
^~~
有人可以解釋一下,這個 C++ 代碼有什么問題嗎?
注意:等效的 C 代碼是有效的,因為int (*)[]
和int (*)[1]
是兼容的。 意思是在 C++ 他們不是?
第一個定義是從初始值設定項推導出的已知邊界數組。 它具有與以下相同的效果:
int x1[1] = {13};
這意味着x1
的類型為int[1]
,而&x1
的類型為int (*)[1]
。
第二個定義試圖從類型為int (*)[1]
的(大括號括起來的)表達式初始化類型為int (*)[]
的變量。 換句話說,它需要從指向具有已知邊界的數組的指針轉換為指向具有未知邊界的數組的指針。
就像 GCC 告訴你的那樣,這種類型的轉換只在 C++20 開始才被允許。 如果您使用最新版本的 Clang 和-std=c++20
編譯您的代碼,它應該可以編譯。 參見https://godbolt.org/z/4zb5xx658
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.