ข้อผิดพลาดของคอมไพเลอร์ที่เป็นไปได้ใน MSVC


13

โค้ดต่อไปนี้คอมไพล์ด้วย gcc และ clang (และคอมไพเลอร์ C ++ 11 อื่น ๆ อีกมากมาย)

#include <stdint.h>

typedef int datatype;

template <typename T>
struct to_datatype {};

template <>
struct to_datatype<int16_t> {
  static constexpr datatype value = 1;
};

template <typename T>
class data {
 public:
  data(datatype dt = to_datatype<T>::value) {}
};

int main() {
  data<char> d{to_datatype<int16_t>::value};
}

เมื่อคอมไพล์ด้วย MSVC ล่าสุด (เกือบ)

> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled

นี่เป็นข้อบกพร่องของ MSVC หรือไม่? ถ้าใช่คำใดในมาตรฐาน C ++ ที่อธิบายได้ดีที่สุด

หากคุณแทนที่ส่วนหนึ่งของรหัสด้วย

template <typename T>
class data {
 public:
  data(datatype dt) {}
  data() : data(to_datatype<T>::value) {}
};

มันรวบรวมได้อย่างราบรื่นอยู่แล้ว


ซับเดี่ยวนี้อาจอธิบายความแตกต่าง ดูว่าคอมไพเลอร์ของคุณกลับมาเป็นstd::is_same_v<char, int8_t>อย่างไร ฉันเดาว่าจะมีการใช้งานที่กำหนดว่า int8_t เป็นเหมือน char แต่จะต้องตรวจสอบเอกสาร
เปลี่ยน igel

ดูเหมือนว่าในความเป็นจริงอาจเป็นข้อผิดพลาด ปัญหานี้เปิดขึ้นเมื่อเร็ว ๆ นี้และมีรายงานอื่นอีกหลายรายงาน
เปลี่ยนแปลงใน

1
@alteredinstance ฉันไม่เห็นว่าปัญหานั้นเกี่ยวข้องกับคำถามนี้อย่างไรหรือการเชื่อมโยงก่อนหน้าของคุณทำเพื่ออะไร คุณเพิ่งคัดลอกลิงก์แรกที่ Google มอบให้สำหรับข้อความแสดงข้อผิดพลาดนี้หรือไม่ ข้อความแสดงข้อผิดพลาดทั่วไปมากและสามารถปรากฏในสถานการณ์ที่แตกต่างกัน (ถูกกฎหมาย) มากมาย
วอลนัท

@walnut Line 231 ของรหัสที่กล่าวถึงในปัญหามีการเชื่อมโยงที่หมดอายุไปยังปัญหา MSVC ด้วยการเริ่มต้นรวม, สิ่งเดียวกันกับที่รหัส OP กำลังทำอยู่ มันเกิดขึ้นเมื่อเร็ว ๆ นี้ว่าไลบรารีvalue
บูสเตอร์ได้พบ

1
และรายงานข้อผิดพลาดใหม่: developercommunity.visualstudio.com/content/problem/871304/…
marcinj

คำตอบ:


8

ฉันจะบอกว่า MSVC ผิดที่จะไม่รับรหัส

ตาม[dcl.fct.default] / 5ของร่างสุดท้ายมาตรฐาน C ++ 17 การค้นหาชื่อในอาร์กิวเมนต์เริ่มต้นของฟังก์ชั่นสมาชิกของเทมเพลตชั้นเรียนจะทำตามกฎใน [temp.inst]

ตาม[temp.inst] / 2 การสร้างอินสแตนซ์โดยนัยของเท็มเพลตคลาสไม่ทำให้เกิดการอินสแตนซ์ของอาร์กิวเมนต์เริ่มต้นของฟังก์ชันสมาชิกและตาม[temp.inst] / 4อาร์กิวเมนต์เริ่มต้นสำหรับฟังก์ชันสมาชิกของ (ความเชี่ยวชาญที่ไม่ชัดเจนของ ก) เทมเพลตชั้นเรียนถูกสร้างอินสแตนซ์เมื่อมีการใช้งานโดยการโทร

ไม่มีการเรียกที่ใช้อาร์กิวเมนต์เริ่มต้นto_datatype<T>::valueในรหัสของคุณดังนั้นจึงไม่ควรสร้างอินสแตนซ์ ดังนั้นจึงไม่ควรมีข้อผิดพลาดเกี่ยวกับการค้นหาvalueเมื่อto_datatype<char>ล้มเหลว

(ส่วนที่เกี่ยวข้องในร่างสุดท้ายสุดท้ายของมาตรฐาน C ++ 11 มีถ้อยคำที่เทียบเท่ายกเว้นการกำหนดหมายเลขโปรดดู[decl.fct.default] / 5 , [temp.inst] / 1และ[temp.inst] / 3แทน)

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