__Func__ পয়েন্টার দুটি কনটেক্সপ্রসের উদাহরণগুলির মধ্যে পার্থক্য কি এখনও কনটেক্সপ্রপ?


14

এটি কি বৈধ সি ++?

int main() {
    constexpr auto sz = __func__ - __func__;
    return sz;
}

জিসিসি এবং এমএসভিসি মনে করে এটি ঠিক আছে, কলং মনে করেন এটি ঠিক নয়: সংকলক এক্সপ্লোরার


সমস্ত সংকলক সম্মত হন যে এটি ঠিক আছে: সংকলক এক্সপ্লোরার

int main() {
    constexpr auto p = __func__;
    constexpr auto p2 = p;
    constexpr auto sz = p2 - p;
    return sz;
}

ঝাঁকুনি আবার এটি পছন্দ করে না, তবে অন্যরা এটির সাথে ঠিক আছে: সংকলক এক্সপ্লোরার

int main() {
    constexpr auto p = __func__;
    constexpr auto p2 = __func__;
    constexpr auto sz = p2 - p;
    return sz;
}

এখানে কি? আমার মনে হয় সম্পর্কহীন পয়েন্টারগুলিতে গাণিতিকটি সংজ্ঞায়িত আচরণ তবে __func__একই পয়েন্টারটি ফেরত দেয়, না? আমি নিশ্চিত নই, তাই আমি ভেবেছিলাম আমি এটি পরীক্ষা করতে পারি। আমি যদি সঠিকভাবে স্মরণ করি তবে অপরিবর্তিত std::equal_toআচরণ ব্যতীত সম্পর্কহীন পয়েন্টারগুলির তুলনা করতে পারি:

#include <functional>

int main() {
    constexpr std::equal_to<const char*> eq{};
    static_assert(eq(__func__, __func__));
}

ক্লেং মনে করে যে eq(__func__, __func__)এটি একটি ধ্রুবক অভিব্যক্তি নয়, যদিও std::equal_to::operator() কনটেক্সটপ্রপ হয় । অন্যান্য সংকলক অভিযোগ করবেন না: সংকলক এক্সপ্লোরার


ঝনঝন এটি একটিও সংকলন করবে না। অভিযোগগুলি যা __func__ == __func__কোনও ধ্রুবক প্রকাশ নয়: সংকলক এক্সপ্লোরার

int main() {
    static_assert(__func__ == __func__);
}

থেকে Function_definition , __func__হিসাবে যদি static const char __func__[] = "function-name";এবং যে সমতুল্য গৃহীত ডেমো ...
Jarod42

মজার ব্যাপার হচ্ছে, এটি কাজ করে যদি আপনার সাথে একটি constexpr পরিবর্তনশীল আরম্ভ __func__এবং ব্যবহারের যে static_assert করুন ...
florestan

@ জারোড 42 তাই এই ঝনঝন মধ্যে একটি বাগ?
আয়ানসান

মত @florestan এই ? এটি ঝাঁকুনির সাথেও সংকলন করবে না। প্রশ্নটিতে আমার দ্বিতীয় এবং তৃতীয় উদাহরণগুলি আপনি যেভাবে উল্লেখ করেছেন are একটি সংকলন, অন্য একটি না।
আয়ানসান

1
সিডাব্লুজি 1962 দেখুন , যা __func__সম্পূর্ণরূপে কনটেক্সপ মূল্যায়ন থেকে মুছে ফেলা হতে পারে ।
ডেভিস হেরিং

উত্তর:


13

__func__সি ++ এ একটি সনাক্তকারী। বিশেষত, এটি একটি নির্দিষ্ট বস্তুর উল্লেখ করে। থেকে [dcl.fct.def.general] / 8 :

ফাংশন-স্থানীয় পূর্বনির্ধারিত ভেরিয়েবলটি _­_­func_­_­যেমন ফর্মের একটি সংজ্ঞা হিসাবে সংজ্ঞায়িত করা হয়

static const char __func__[] = "function-name";

সরবরাহ করা হয়েছিল, যেখানে ফাংশন-নামটি একটি বাস্তবায়ন-সংজ্ঞায়িত স্ট্রিং। প্রোগ্রামের অন্য কোনও অবজেক্টের থেকে এই জাতীয় কোনও ভেরিয়েবলের ঠিকানা আলাদা কিনা তা অনির্দিষ্ট।

একটি ফাংশন-স্থানীয় পূর্বনির্ধারিত পরিবর্তনশীল হিসাবে , এই সংজ্ঞাটি (যেমন) ফাংশন ব্লকের শুরুতে উপস্থিত হয়। সেই হিসাবে, __func__সেই ব্লকের মধ্যে যে কোনও ব্যবহার সেই পরিবর্তনশীলটিকে বোঝায়।

"অন্য কোনও বস্তু" অংশ হিসাবে, একটি ভেরিয়েবল একটি বস্তুর সংজ্ঞা দেয়। __func__যে ভেরিয়েবল দ্বারা সংজ্ঞায়িত বস্তুর নাম। সুতরাং, একটি ফাংশনের মধ্যে, __func__নামের সমস্ত ব্যবহার একই ভেরিয়েবল। যা অপরিবর্তিত তা হ'ল সেই পরিবর্তনশীলটি অন্য বস্তুর থেকে পৃথক বস্তু কিনা ।

এটি হ'ল, যদি আপনি নামের কোনও ফাংশনে থাকেন এবং সমস্যাটির ক্ষেত্রে আপনি অন্য কোথাও fooআক্ষরিক ব্যবহার করেন "foo"তবে চলকটি __func__একইরকম বস্তু হিসাবে একইরূপে হওয়া কার্যকর করা নিষিদ্ধ নয়"foo" ফিরে আসে । এটি হ'ল, স্ট্যান্ডার্ডটির প্রতিটি ফাংশনের প্রয়োজন নেই__func__ প্রদর্শিত হবে অবশ্যই স্ট্রিং আক্ষরিক থেকে পৃথক করে ডেটা সংরক্ষণ করতে হবে।

এখন, সি ++ এর "যেন" নিয়ম বাস্তবায়নগুলি এ থেকে বিচ্যুত হতে দেয় তবে তারা এটি এমনভাবে করতে পারে না যা সনাক্তযোগ্য be সুতরাং, যখন ভেরিয়েবল নিজেই অন্য বস্তুর থেকে পৃথক ঠিকানা থাকতে পারে বা নাও পারে, __func__একই ফাংশনে ব্যবহারগুলি অবশ্যই একই আচরণ করতে হবে যেমন তারা একই বস্তুর উল্লেখ করছে।

ঝাঁকুনি __func__এইভাবে বাস্তবায়ন করবে বলে মনে হয় না । এটি এটি কার্যকর করে মনে হচ্ছে এটি যদি ফাংশনটির নামের একটি মূল্যবান স্ট্রিংটি ফিরিয়ে দেয়। দুটি স্বতন্ত্র স্ট্রিং লিটারেলগুলিকে একই বস্তুর উল্লেখ করতে হবে না, সুতরাং তাদেরকে পয়েন্টারগুলি বিয়োগ করে ইউবি। এবং একটি ধ্রুবক অভিব্যক্তি প্রসঙ্গে অনির্ধারিত আচরণটি দুর্গঠিত।

একমাত্র জিনিসটি আমাকে বলতে দ্বিধাগ্রস্থ করে তোলে যে এখানে কলং 100% ভুল [টিম্পার.আরগ.নোনটাইপ] / 2 :

রেফারেন্স বা পয়েন্টার ধরণের একটি অ-টাইপ টেম্পলেট-প্যারামিটারের জন্য, ধ্রুবক প্রকাশের মান উল্লেখ করা যাবে না (বা পয়েন্টার ধরণের জন্য, এর ঠিকানা হবে না):

...

  • একটি পূর্বনির্ধারিত _­_­func_­_পরিবর্তনশীল।

দেখুন, এটি বাস্তবায়নের মাধ্যমে কিছুটা ফ্যাদিংয়ের অনুমতি দেবে বলে মনে হচ্ছে। যে, যখন__func__ প্রযুক্তিগতভাবে ধ্রুবক প্রকাশ হতে পারে তবে আপনি এটি কোনও টেম্পলেট প্যারামিটারে ব্যবহার করতে পারবেন না। এটি প্রযুক্তিগতভাবে পরিবর্তনশীল হলেও এটি একটি স্ট্রিং আক্ষরিকের মতো বিবেচিত হয়।

সুতরাং কিছু স্তরে আমি বলব যে স্ট্যান্ডার্ডটি তার মুখের উভয় দিক থেকে কথা বলছে।


সুতরাং, কঠোরভাবে বলতে __func__আমার প্রশ্নে সব ক্ষেত্রে একটি ধ্রুবক অভিব্যক্তি হতে পারে, তাই না? কোডটি সংকলন করা উচিত ছিল।
আয়সান

"এই জাতীয় চলকের প্রোগ্রামের অন্য কোনও অবজেক্টের থেকে পৃথক কোনও ঠিকানা রয়েছে কিনা তা অনির্দিষ্ট।" অংশ? অনির্ধারিত আচরণ মানে বিমূর্ত মেশিনের আচরণে অ-নির্ধারণবাদ ism এগুলি কি কনস্টেক্সপ্রায় মূল্যায়নের জন্য সমস্যাযুক্ত হতে পারে? যদি __func__ঠিকানার প্রথম উপস্থিতিটির জন্য অন্য কোনও অবজেক্টের সাথে একই রকম হয়, এবং দ্বিতীয় বারে __func__এটি না হয় তবে কী হবে? মঞ্জুর, এর অর্থ এই নয় যে ঠিকানাটি দুটি দৃষ্টান্তের মধ্যে পৃথক, তবে আমি এখনও বিভ্রান্ত!
জোহানেস স্কাউব -

@ জোহানেস শ্যাব-লিটব: " কী হবে" এই জাতীয় পরিবর্তনের কোনও ঠিকানা প্রোগ্রামের অন্য কোনও অবজেক্টের থেকে পৃথক ঠিকানা আছে কিনা তা অনির্ধারিত? " অংশ? " কী? __func__ম্যাক্রো নয়; এটি একটি সনাক্তকারী যা একটি নির্দিষ্ট পরিবর্তনশীল এবং সেইজন্য একটি নির্দিষ্ট অবজেক্টের নাম দেয়। অতএব, __func__একই ফাংশনটিতে যে কোনও ব্যবহারের ফলে এমন এক গ্লুয়ু হওয়া উচিত যা একই বস্তুকে বোঝায়। বা আরও বেশি বিষয়, এটি এমনভাবে কার্যকর করা যায় না যে এটি হবে না।
নিকল বোলাস

@ নিকোল যা একই বস্তুকে বোঝায়। তবে সেই অবজেক্টের তাত্ক্ষণিকভাবে অন্য ঠিকানার মতো একই ঠিকানা থাকতে পারে। এবং অন্য তাত্ক্ষণিকভাবে না। আমি বলছি না যে এটি একটি সমস্যা, তবে আমি সবাইকে এই সম্ভাবনার কথা মনে করিয়ে দিচ্ছি। এবং সর্বোপরি, আমারও ভুল হতে পারে, তাই আমি সংশোধন হওয়ার বা নিশ্চিত হওয়ার আশায় এটিও বলছি।
জোহানেস স্কাউব -

@ জোহানেস শ্যাব-লিটব: " তবে সেই বস্তুর তাত্ক্ষণিকভাবে অন্য বস্তুর মতো ঠিকানা থাকতে পারে " "এটি সি ++ অবজেক্ট মডেলের অধীনে অনুমোদিত নয়। দুটি বস্তু, দু'জনেরই অন্যের মধ্যে বাসা বাঁধে না, উভয়ই একই সময়ে একই স্টোরেজে তাদের জীবনকালের মধ্যে থাকতে পারে না। এবং প্রশ্নের মধ্যে থাকা অবজেক্টের স্থিতিশীল স্টোরেজ সময়কাল রয়েছে, সুতরাং আপনি যদি না newএটি ব্যবহার না করে প্রোগ্রামটি শেষ না হওয়া পর্যন্ত এটি কোথাও চলে না।
নিকল বোলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.