int সংখ্যা -> পয়েন্টার রূপান্তর নিয়ম


19

নিম্নলিখিত কোড বিবেচনা করুন।

void f(double p) {}
void f(double* p) {}

int main()
{ f(1-1); return 0; }

এমএসভিসি 2017 এটি সংকলন করে না। এটি পরিসংখ্যান করে যে এখানে একটি অস্পষ্ট ওভারলোডেড কল রয়েছে, যেমনটি 1-1একই 0এবং তাই রূপান্তরিত হতে পারে double*। অন্যান্য ঠাট, মত 0x0, 0Lঅথবা static_cast<int>(0), নয়তো কাজ করে না। এমনকি একটি ঘোষণা করা const int Zero = 0এবং কল করা f(Zero)একই ত্রুটি তৈরি করে। এটি যদি Zeroনা হয় তবে সঠিকভাবে কাজ করে const

দেখে মনে হচ্ছে একই সমস্যাটি জিসিসি 5 এবং এর নীচে প্রযোজ্য, কিন্তু জিসিসি 6 নয় I আমি আগ্রহী যদি এটি সি ++ স্ট্যান্ডার্ড, পরিচিত এমএসভিসি বাগ, বা সংকলকটিতে একটি সেটিংয়ের অংশ হয়। একটি অভিশাপ গুগল ফলাফল দেয় নি।

উত্তর:


18

এমএসভিসি 1-1একটি নাল পয়েন্টার ধ্রুবক হিসাবে বিবেচনা করে। এটি সি ++ 03 এর মান দ্বারা সঠিক ছিল, যেখানে মান সহ সমস্ত অবিচ্ছেদ্য ধ্রুবক অভিব্যক্তি 0নাল পয়েন্টার ধ্রুবক ছিল, তবে এটি পরিবর্তন করা হয়েছিল যাতে কেবল শূন্য পূর্ণসংখ্যার অক্ষরগুলি সি ++ 11 এর সিউডিজি ইস্যু 903 সহ নাল পয়েন্টার ধ্রুবক হয় । এটি একটি ব্রেকিং পরিবর্তন, যেমন আপনি আপনার উদাহরণে দেখতে পাচ্ছেন এবং মান হিসাবে নথিভুক্তও রয়েছে, দেখুন সি ++ 14 স্ট্যান্ডার্ডের (ডিফ্রন্ট এন 4140) [ডিফারপ্প

এমএসভিসি এই পরিবর্তনটি শুধুমাত্র কনফারেন্স মোডে প্রয়োগ করে। সুতরাং আপনার কোডটি /permissive-পতাকাটির সাথে সংকলন করবে , তবে আমি মনে করি যে পরিবর্তনটি কেবলমাত্র এমএসভিসি 2019 তে কার্যকর হয়েছিল, এখানে দেখুন

জিসিসির ক্ষেত্রে, জিসিসি 5 সি ++ 98 মোডের ডিফল্ট, অন্যদিকে জিসিসি 6 এবং পরে সি ++ 14 মোডে ডিফল্ট হয়েছে, এই কারণেই আচরণের পরিবর্তনটি জিসিসি সংস্করণের উপর নির্ভর করে বলে মনে হচ্ছে।

যদি আপনি fএকটি নাল পয়েন্টার ধ্রুবককে আর্গুমেন্ট হিসাবে কল করেন, তবে কলটি দ্ব্যর্থক, কারণ নাল পয়েন্টার ধ্রুবকটি কোনও পয়েন্টার ধরণের নাল পয়েন্টার মানের রূপান্তরিত হতে পারে এবং এই রূপান্তরটি int(বা কোনও অবিচ্ছেদ্য ধরণের) রূপান্তর হিসাবে একই র‌্যাঙ্কযুক্ত থাকে because to double


-1

সংকলকটি [ওভার.ম্যাচ] এবং [ কনও] অনুসারে সঠিকভাবে কাজ করে , আরও সুনির্দিষ্টভাবে [কনভেন্টফিনপিন্ট] এবং [কনফিটার]।

একটি স্ট্যান্ডার্ড রূপান্তর ক্রম হ'ল [ব্লাহ ব্লাহ] জিরো বা এক [...] ভাসমান-ইন্টিগ্রাল রূপান্তর, পয়েন্টার রূপান্তর, [...]।

এবং

একটি পূর্ণসংখ্যার প্রকারের বা একটি অবিরত গণনা প্রকারের একটি মূল্যকে একটি ভাসমান-বিন্দু প্রকারের রূপান্তরিত করা যেতে পারে। যদি সম্ভব হয় তবে ফলাফলটি সঠিক [

এবং

একটি নাল পয়েন্টার ধ্রুবক হল মান শূন্য বা [...] সহ একটি পূর্ণসংখ্যার আক্ষরিক। একটি নাল পয়েন্টার ধ্রুবক একটি পয়েন্টার ধরণের রূপান্তর করা যেতে পারে; ফলাফলটি হ'ল প্রকারের নাল পয়েন্টার মান [ব্লাহ ব্লাহ]

এখন, ওভারলোড রেজোলিউশনটি হ'ল সমস্ত প্রার্থীর ফাংশনগুলির মধ্যে সেরা ম্যাচটি বেছে নেওয়া (যা মজাদার বৈশিষ্ট্য হিসাবে, কল লোকেশনেও অ্যাক্সেসযোগ্য হওয়া দরকার না!)। সেরা ম্যাচটি হ'ল সঠিক পরামিতিগুলির সাথে বা বিকল্পভাবে, খুব কম সম্ভাব্য রূপান্তরগুলির সাথে। জিরো বা একটি মানক রূপান্তর ঘটতে পারে (প্রতিটি প্যারামিটারের জন্য) এবং শূন্যের তুলনায় একটি "ভাল"।

(1-1)মান সহ একটি পূর্ণসংখ্যার আক্ষরিক 0

তোমার শূন্য পূর্ণসংখ্যা আক্ষরিক রূপান্তর করতে পারেন প্রতিটি পারেন এর doubleবা double*(অথবা nullptr_t), সঙ্গে ঠিক একটি রূপান্তর। সুতরাং, ধরে নিই যে এই ফাংশনগুলির একটিরও বেশি ঘোষিত হয়েছে (উদাহরণস্বরূপ) একক প্রার্থীর চেয়েও বেশি উপস্থিত রয়েছে, এবং সমস্ত প্রার্থী সমানভাবে ভাল, এর চেয়ে সেরা কোনও মিল নেই। এটি অস্পষ্ট, এবং সংকলক অভিযোগ করার বিষয়ে ঠিক।


1
কিভাবে 1-1একটি পূর্ণসংখ্যা আক্ষরিক হয় ? এটি একটি অভিব্যক্তি যা মান 1এবং -অপারেটর সহ দুটি পূর্ণসংখ্যার আক্ষরিক থাকে ।
আখরোট

@ আখরোট: আপনি সম্ভবত বিশ্রী শব্দের সাথে "বাইনারি- ডিজিটস, অষ্টক -সংখ্যা, অঙ্ক বা হেক্সাডেসিমাল-অঙ্কের ক্রম" উল্লেখ করেছেন । এটি একটি অত্যন্ত দুর্ভাগ্যজনকভাবে শব্দ "স্পষ্টত" এর পরিবর্তে বলা হয়েছে, যা এমন কিছু প্রস্তাব দেয় যা কেস নয় (যেমন বিয়োগের চরিত্র বাদ দিয়ে)। কেবল "অঙ্কগুলি" এবং পেডেন্টালি "ডিজিট" (0 ... 9 এর মধ্যে একটি) এর সংজ্ঞা অনুসারে কোনও নেতিবাচক আক্ষরিক (যেমন -1) থাকা সম্ভব নয় । যেহেতু, যেহেতু ডিফল্ট প্রকারটি স্বাক্ষরিত হয়েছে তবে এটি স্পষ্টতই প্রয়োজনীয় এবং এটি সম্ভবত প্রদর্শিত (এবং সর্বজনস্বীকৃত )ও সম্ভব।
দামোন

1
আমি মানক লিঙ্কে দেখানো পূর্ণসংখ্যা-আক্ষরিক জন্য ব্যাকরণটি উল্লেখ করছি , যা মেলে না 1-1। সি ++ এর নেতিবাচক পূর্ণসংখ্যার অক্ষর থাকে না। -1একটি 1পূর্ণসংখ্যার আক্ষরিক (স্বাক্ষরিত প্রকারের) এবং একটি -অ্যানারি বিয়োগ অপারেটর দ্বারা গঠিত একটি অভিব্যক্তি । Cppreferences.com- এ "নোটস" বিভাগটিও দেখুন
আখরোট

এটি অবশ্যই সত্য যে ব্যাকরণটির এটি নেই তবে এটি ব্যাপকভাবে অসংলগ্ন। অপরিহার্যতা দ্বারা এবং সংজ্ঞা দ্বারা, সি ++ খুব আছে , নেতিবাচক লিটারেল যেহেতু, যদি না আপনি স্পষ্টভাবে পরিশেষে যোগ u, আপনার আক্ষরিক হয়, সংজ্ঞা অনুযায়ী, স্বাক্ষর করেন। সাইন ইন ধরনের আছে নেতিবাচক মান (সম্ভাব্য মান 50% সম্পর্কে নেতিবাচক)। এটি দুর্ভাগ্যজনক যে ব্যাকরণ (যে কারণে আমি জানতাম না) এইভাবে বিভ্রান্তিকর, এবং যদিও প্রযুক্তিগতভাবে (ব্যাকরণ অনুসারে) -1 অন্যান্য ধরণের মাধ্যমে ইতিবাচক আক্ষরিক, উপেক্ষিত, অবশ্যই একটি নেতিবাচক আক্ষরিক। 3 + 4 এর মতো অনেকটা আক্ষরিক।
দামোন

যাইহোক - আমি চেষ্টা করেছি 0U। একই সমস্যা। আমি যা চেষ্টা করেছিলাম তা একটি enumমান। হতে পারে একটি নামকরণকৃত জিনিসগুলি বদলে দিত। আমি decltypeএবং দিয়ে একটি দীর্ঘ অভিব্যক্তি লিখে শেষ করেছি remove_reference
ব্যবহারকারী 1334767
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.