ต้องใช้นิพจน์ที่ได้รับอนุญาตในการ "จับ" ตัวแปรของขอบเขตการล้อมรอบหรือไม่


10

ในตัวอย่างต่อไปนี้อาร์กิวเมนต์ของฟังก์ชันถูกใช้เพื่อทดสอบด้วยนิพจน์ที่ต้องการว่านิพจน์ที่ใช้พวกเขานั้นมีรูปแบบที่ดีหรือไม่ การแสดงออกต้องไม่มีการโต้แย้ง; มันใช้ตัวแปรในขอบเขตฟังก์ชั่นโดยตรง:

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

โค้ดข้างต้นคอมไพล์ด้วยสาขาแนวคิดของ Clang อย่างไรก็ตาม GCC10 Resizeยอมรับเฉพาะการเรียกร้องให้ GCC9 ICEs เสียงดังกราวถูกต้องไหมเมื่อยอมรับมัน?


2
ICE เป็นปัญหาคอมไพเลอร์เสมอ
Jarod42

ฉันจะบอกว่ามันควรจะปฏิเสธรหัสหากไม่ได้รับอนุญาตให้จับตัวแปรท้องถิ่น (ดังนั้นทั้งสองResizeและEziserควรจะปฏิเสธ) หรือฟังก์ชั่นทั้งสองควรรวบรวม ฉันจะบอกว่าเสียงดังกราวถูกต้อง
Jarod42

@ Jarod42 ใช่ พฤติกรรม GCC เป็นบั๊กซีอย่างชัดเจน ฉันจะทำการประชาสัมพันธ์ ฉันยังคิดว่าเสียงดังกังวานนั้นถูกต้อง แต่ฉันต้องการยืนยัน
metalfox

คำตอบ:


6

ใช่ต้องใช้นิพจน์สามารถใช้สิ่งที่อยู่ในขอบเขต มันต้องการเพียงประเภทของสิ่งที่มันชื่อหลังจากทั้งหมดยกเว้นในความต้องการซ้อนกันหรือการแสดงออกคงที่อื่น ๆ นั่นเป็นความจริงของการประกาศโดยรอบเช่นเดียวกับพารามิเตอร์ (เป็นทางการ) ของตัวเอง

[expr.prim.req] / 5 :

ความต้องการของร่างกายประกอบด้วยลำดับของความต้องการ ข้อกำหนดเหล่านี้ อาจอ้างถึงพารามิเตอร์โลคัลพารามิเตอร์เทมเพลตและการประกาศอื่น ๆ ที่มองเห็นได้จากบริบทที่ล้อมรอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.