এটি কি পুরানো সি ++ স্টাইলের নির্মাতা?


17

এখানে সি ++ কোডের একটি অংশ।

এই উদাহরণে, অনেক কোড ব্লক কনস্ট্রাক্টর কলগুলির মতো লাগে। দুর্ভাগ্যক্রমে, ব্লক কোড # 3 নয় (আপনি https://godbolt.org/z/q3rsxn এবং https://cppinsights.io ব্যবহার করে এটি পরীক্ষা করতে পারেন )।

আমি মনে করি, এটি একটি পুরানো সি ++ স্বরলিপি এবং এটি C} (সিএফ # 4) ব্যবহার করে নতুন সি ++ 11 নির্মাণের স্বরলিপিটি ব্যাখ্যা করতে পারে।

T(i)অর্থের জন্য আপনার কাছে কি ব্যাখ্যা আছে , তবে কোনও নির্মাণকারী সংকেতের খুব কাছে, তবে স্পষ্টতই এতটা আলাদা?

struct T {
   T() { }
   T(int i) { }
};

int main() {
  int i = 42;
  {  // #1
     T t(i);     // new T named t using int ctor
  }
  {  // #2
     T t = T(i); // new T named t using int ctor
  }
  {  // #3
     T(i);       // new T named i using default ctor
  }
  {  // #4
     T{i};       // new T using int ctor (unnamed result)
  }
  {  // #5
     T(2);       // new T using int ctor (unnamed result)
  }
}

নোট: সুতরাং, T(i)(# 3) সমান T i = T();


1
আমি মনে করি আপনার সমস্ত বক্তব্য সঠিক।
আরনে জে


নোট করুন যে সংকলকটি আপনাকে কেবল এটি জিজ্ঞাসা করা উচিত তা জানার জন্য আপনাকে যা যা জানাতে হবে তা জানাতে হবে: যুক্ত করুন -Wallএবং আপনিwarning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse] ঝনঝন থেকে " " পান বা জিসিসি থেকে কিছুটা কম অনুপ্রাণিত " warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]" হন
ম্যাক্স ল্যাংফোফ

@ কুইন্টিন ইউকে এই লিঙ্কটির জন্য আপনাকে ধন্যবাদ। আমি এটি সম্পর্কে ফাংশন সম্পর্কে সচেতন ছিল (উদাহরণস্বরূপ T t()) তবে এত সাধারণ ঘোষণাপূর্ণ প্রকাশের জন্য নয়। অবশ্যই, এটি উদ্বেগজনক হতে পারে ।
পাস্কাল এইচ।

উত্তর:


17

বিবৃতি:

T(i);

সমান:

T i;

অন্য কথায়, এটি iটাইপের সাথে নামযুক্ত একটি ভেরিয়েবল ঘোষণা করে T। এর কারণ হল যে কোনও স্থানে ঘোষণাপত্রের মাধ্যমে বন্ধনীগুলি অনুমোদিত হয় (ঘোষকগণের বাধ্যবাধকতা পরিবর্তনের জন্য) এবং যেহেতু এই বিবৃতিটি একটি ঘোষণাপত্র হিসাবে বিশ্লেষণ করা যেতে পারে, এটি একটি ঘোষণা (যদিও এটি একটি অভিব্যক্তি হিসাবে আরও অর্থবোধ করতে পারে)।


সুতরাং, এটি কি কেবল সি-স্পেসিফিকেশন থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি ব্যাখ্যা পছন্দ যেখানে int(i)একটি intনামও ঘোষণা করে i?
পাস্কাল এইচ।

@PascalH। একটি নির্দিষ্ট দৃষ্টিকোণ থেকে, এটি সত্য হতে পারে। স্ট্রাস্ট্রাপ ডি অ্যান্ড ইতে লিখেছেন যে তিনি সি ++ এর জন্য বিকল্প, আরও স্বজ্ঞাত ঘোষণার বাক্য গঠন বিবেচনা করেছেন। যদি সি ++ সি এর সাথে পশ্চাদপটে সামঞ্জস্যপূর্ণ না হত, তবে সম্ভবত এটির বিকল্প বাক্য গঠন থাকতে পারে এবং এভাবে প্রকাশের সাথে সম্ভাব্য অস্পষ্টতা এড়ানো যায়।
ব্রায়ান

-1

এসেমব্লারারে কী ঘটে তা দেখতে আপনি সংকলক এক্সপ্লোরার ব্যবহার করতে পারেন ।

আপনি দেখতে পাচ্ছেন যে # 1, # 2 # 4 এবং # 5 একই কাজ করে তবে অবিচ্ছিন্নভাবে # 3 অন্য কনস্ট্রাক্টরকে (বেস অবজেক্ট কনস্ট্রাক্টর) কল করুন।

কারও কি ব্যাখ্যা আছে?

এসেমব্লার কোড:

::T() [base object constructor]:
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        pop     rbp
        ret
T::T(int):
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     DWORD PTR [rbp-12], esi
        nop
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 42
// #1
        mov     edx, DWORD PTR [rbp-4]
        lea     rax, [rbp-7]
        mov     esi, edx
        mov     rdi, rax
        call    T::T(int)
// #2
        mov     edx, DWORD PTR [rbp-4]
        lea     rax, [rbp-8]
        mov     esi, edx
        mov     rdi, rax
        call    T::T(int)
// #3
        lea     rax, [rbp-9]
        mov     rdi, rax
        call    T::T() [complete object constructor]
// #4
        mov     edx, DWORD PTR [rbp-4]
        lea     rax, [rbp-6]
        mov     esi, edx
        mov     rdi, rax
        call    T::T(int)
// #5
        lea     rax, [rbp-5]
        mov     esi, 2
        mov     rdi, rax
        call    T::T(int)

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