এমএসভিসিতে সম্ভাব্য সংকলক বাগ


13

নিম্নলিখিত কোডটি জিসিসি এবং ঝনঝন (এবং আরও অনেক সি ++ 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};
}

(প্রায়) সর্বশেষতম এমএসভিসির সাথে সংকলন করার সময়

> 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

এটি কি এমএসভিসির একটি বাগ? যদি হ্যাঁ, তবে সি ++ স্ট্যান্ডার্ডের কোন শব্দটি এটিকে সর্বোত্তমভাবে বর্ণনা করে?

আপনি যদি কোডটির কিছু অংশ দিয়ে প্রতিস্থাপন করেন

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

এটি যেভাবেই সহজেই সংকলন করে।


এই ওয়ান-লাইনার পার্থক্য ব্যাখ্যা করতে পারে। আপনার সংকলকরা কীসের জন্য ফিরে আসে তা দেখুন std::is_same_v<char, int8_t>। আমার অনুমানটি হ'ল এটি বাস্তবায়ন সংজ্ঞায়িত হয় যা অন্তর্নির্মিত 8 টি চরের সমান কিনা, তবে একটিতে ডকুমেন্টেশন চেক করা দরকার।
ইগেল

দেখে মনে হচ্ছে এটি আসলে একটি বাগ হতে পারে। এই সমস্যাটি সম্প্রতি খোলা হয়েছিল এবং আরও বেশ কয়েকটি প্রতিবেদন প্রকাশিত হয়েছে।
alteredinstance

1
@ অল্টারডিনস্ট্যান্স আমি দেখতে পাচ্ছি না যে এই সমস্যাটি কীভাবে এই প্রশ্নের সাথে সম্পর্কিত, বা আপনার আগের লিঙ্কটি কীভাবে এই বিষয়টি করে। গুগল এই ত্রুটি বার্তার জন্য যে প্রথম লিঙ্কটি দিয়েছিল তা কি আপনি অনুলিপি করেছেন? ত্রুটি বার্তাটি খুব জেনেরিক এবং বিভিন্ন (বৈধ) পরিস্থিতিতে উপস্থিত হতে পারে।
আখরোট

ইস্যুতে উল্লিখিত কোডটির @ ওলান্ট লাইন 231 এর এমএসভিসি ইস্যুতে সামগ্রিক সূচনা সহ একটি বিচ্ছিন্ন লিঙ্ক রয়েছে, ওপি-র কোড একই কাজ করছে। এটি ঠিক তাই ঘটে যে বুস্ট গ্রন্থাগারটি সম্প্রতি valueএমএসভিসির সাথে সামগ্রিক প্রকারে ব্যবহার করে একই ধরণের সমস্যায় চলেছে
এলটার্নস্ট্যান্স

1
এবং একটি নতুন বাগ প্রতিবেদন: developercommune.visualstudio.com/content/problem/871304/…
মার্চিনজ

উত্তর:


8

আমি বলব এমএসভিসি কোডটি গ্রহণ না করা ভুল।

মতে [dcl.fct.default] / 5 সি ++ 17 মান চূড়ান্ত ড্রাফট, একটি বর্গ টেম্পলেটের একটি সদস্য ফাংশনের ডিফল্ট আর্গুমেন্ট লুকআপ নাম [temp.inst] এ নিয়ম অনুযায়ী সম্পন্ন করা হয়।

[Temp.inst] / 2 অনুসারে শ্রেণীর টেমপ্লেটের অন্তর্নিহিত ইনস্ট্যান্টেশন সদস্য ফাংশনগুলির ডিফল্ট আর্গুমেন্টগুলির তাত্ক্ষণিক কারণ ঘটায় না এবং [temp.inst] / 4 অনুসারে একটি এর সদস্য ফাংশনের জন্য একটি ডিফল্ট যুক্তি (এর স্পষ্টত না বিশেষায়িতকরণ) ক) শ্রেণীর টেম্পলেটটি যখন কোনও কল দ্বারা ব্যবহৃত হয় তখন তা তাত্ক্ষণিক হয়।

to_datatype<T>::valueআপনার কোডটিতে ডিফল্ট আর্গুমেন্ট ব্যবহার করে কোনও কল নেই এবং তাই এটি তাত্ক্ষণিক হওয়া উচিত নয়। অতএব সেখানে অনুসন্ধান এমন কোনো ত্রুটির সম্মুখীন করা উচিত হবে না valueto_datatype<char>ব্যর্থ।

(সি ++ ১১ টি স্ট্যান্ডার্ড চূড়ান্ত খসড়ার প্রাসঙ্গিক বিভাগগুলিতে সংখ্যা বাদে সমতুল্য শব্দাবলি রয়েছে, [decl.fct.default] / 5 , [temp.inst] / 1 এবং [temp.inst] / 3 এর পরিবর্তে দেখুন))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.