অনুলিপি তালিকা সূচনা? কেন এই সংকলন করে?


13

আমি মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সম্প্রদায় 2019, ভি 16.5.2 ব্যবহার করছি। আমি তালিকা সূচনা পরীক্ষা করতে চান

নিম্নলিখিত পরীক্ষার প্রোগ্রামটি দেখুন:

#include <string>

void foo(std::string str) {}

int main() {

    foo( {"str1", "str2"} );

    return 0;
}

এটি ত্রুটি এবং সতর্কতা ছাড়াই সংকলন করে। কেন?

এটি একটি রানটাইম ত্রুটি দেয়: Expression: Transposed pointer range

কেউ কি দয়া করে এখানে কী ঘটছে তা ব্যাখ্যা করতে পারেন?


সম্পাদনা করুন।

আমি কোডটি বিযুক্ত করেছি এবং এটি ডিবাগারে চালাচ্ছি

    foo( {"str1", "str2"} );
00F739A8  sub         esp,1Ch  
00F739AB  mov         esi,esp  
00F739AD  mov         dword ptr [ebp-0C8h],esp  
00F739B3  lea         ecx,[ebp-0D1h]  
00F739B9  call        std::allocator<char>::allocator<char> (0F7136Bh)  
00F739BE  push        eax  
00F739BF  push        offset string "str2" (0F84DB8h)  
00F739C4  push        offset string "str1" (0F84E2Ch)  
00F739C9  mov         ecx,esi  
00F739CB  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> ><char const *,0> (0F71569h)  
00F739D0  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (0F71843h)  
00F739D5  add         esp,1Ch  

এটি কনস্ট্রাক্টরের প্রথম কলে ক্রাশ হয়?


আমি আপনার সম্পাদনাটি বুঝতে পারি না, তবে মনে হচ্ছে এটি অন্যরকম একটি প্রশ্ন, সুতরাং এর জন্য আপনাকে কি নতুন প্রশ্ন পোস্ট করা দরকার?
হাঁস

উত্তর:


16

std::stringএকটি টেম্পলেট কনস্ট্রাক্টর রয়েছে যা একটি প্রারম্ভিক / শেষে পুনরুদ্ধারকারী জোড়া থেকে একটি স্ট্রিং তৈরি করে। সি ++ এ স্ট্রিং লিটারেলগুলি const char*এস এ নামান । এবং পয়েন্টারগুলি পুনরাবৃত্ত হয়। অতএব, তালিকা সূচনাটি শুরু / শেষের জোড় নির্মাণকারী চয়ন করেছে picked

আপনি একটি রানটাইম ত্রুটি পেয়েছেন কারণ দুটি পয়েন্টার আসলে একটি বৈধ ব্যাপ্তি তৈরি করে না, যা সংকলন-সময়ে (সাধারণত) নির্ধারণ করা যায় না।


আমি বুঝেছি. পরিসীমা নির্মাতা। আমি কোডটি বিচ্ছিন্ন করে ডিবাগ করেছি ged এটি কনস্ট্রাক্টরকে প্রথম কল করার সময় ক্র্যাশ হয়ে যায়। আমি বুঝতে পারি না <char const *,0>। কেউ দয়া করে এটি ব্যাখ্যা করতে পারেন?
আরমিন মন্টিগনি

এর মানে হল যে এটা ডাকছে template< InputIt > (InputIt first, InputIt last,...)কন্সট্রাকটর যেখানে টেমপ্লেট প্যারামিটার iterহয় const char*.... এবং দৃশ্যত আপনার বাস্তবায়ন কোনো কারণে একটি দ্বিতীয় পূর্ণসংখ্যা প্যারামিটার রয়েছে?
হাঁস

@ আর্মিনমন্টিগনি: কী ব্যাখ্যা করবেন? বিচ্ছিন্নতা মূলত অপ্রাসঙ্গিক। আপনার কোডটি সিনথেটিকভাবে বৈধ বলে উল্লেখ করা হয়েছে তবে এটির পুনরাবৃত্তিকারীদের বৈধ পরিসরটি পাস না করার কারণে এটি অপরিবর্তিত আচরণ দেয়। আপনার কোডটি অ-কার্যকরী কেন তা বোঝার জন্য আপনাকে বিচ্ছিন্নতা বোঝার দরকার নেই।
নিকল বোলাস

8

std::string আকারে একটি কনস্ট্রাক্টর ওভারলোড রয়েছে

template< class InputIt >
basic_string( InputIt first, InputIt last,
              const Allocator& alloc = Allocator() );

এবং এটি বলা হয় কারণ "str1"এবং "str2"ক্ষয়ের এর ক্ষয় const char*এবং const char*এটি একটি গ্রহণযোগ্য পুনরাবৃত্তকারী টাইপ।

আপনি ক্র্যাশ পেয়েছেন কারণ আপনি ফাংশনে পাস করেছেন "পুনরাবৃত্ত পরিসর" অবৈধ।


ধন্যবাদ, বুঝেছি +1 টি। সম্পাদনা দেখুন।
আরমিন মন্টিগনি

7

এটি স্টাডি :: স্ট্রিং ()) এর পুনরাবৃত্তকারীগুলির সাথে কনস্ট্রাক্টর ব্যবহার করে ।

template< class InputIt >
constexpr basic_string( InputIt first, InputIt last,
                        const Allocator& alloc = Allocator() );

[ InputIt= const char*] সহ।

এরপরে {"str1", "str2"}অবৈধ হওয়ায় আপনার ইউবি রয়েছে ।


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