আবশ্যকীয় আবশ্যকতা কি ঘেরের সুযোগের ভেরিয়েবলগুলি "ক্যাপচার" করার অনুমতি দেওয়া হয়েছে?


10

নিম্নলিখিত উদাহরণে, ফাংশন আর্গুমেন্টগুলি ব্যবহার করে একটি অভিব্যক্তি ভালভাবে গঠিত কিনা তা একটি অভিব্যক্তিগুলির সাথে পরীক্ষা করতে ব্যবহৃত হয়। প্রয়োজনীয় প্রকাশটি কোনও যুক্তি গ্রহণ করে না; এটি সরাসরি ফাংশন স্কোপে ভেরিয়েবলগুলি ব্যবহার করে:

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

উপরের কোডটি ক্ল্যাং কনসেপ্ট শাখার সাথে সংকলন করে। তবে, জিসিসি 10 কেবল এই কলটি গ্রহণ করে Resize। জিসিসি 9 আইসিইএস। ঝাঁকুনি কি এটি মেনে নেওয়ার অধিকার আছে?


2
আইসিই সর্বদা সংকলক ইস্যু।
জারোড 42

(উভয় তাই আমি বলতে হবে যদি এটি স্থানীয় পরিবর্তনশীল ক্যাপচার করার অনুমতি নেই যে হয় এটা কোড প্রত্যাখ্যান করা উচিত Resizeএবং Eziserহওয়া উচিত প্রত্যাখ্যান) অথবা উভয় ফাংশন কম্পাইল করা উচিত নয়। আমি বলবো ঝাঁকুনি ঠিক আছে।
জারোড 42

@ জারোড 42 হ্যাঁ জিসিসির আচরণ পরিষ্কারভাবে বগি। আমি একটি পিআর ফাইল করব। আমিও মনে করি যে কলং সঠিক, তবে আমি তা নিশ্চিত করতে চাই।
ধাতবফক্স

উত্তর:


6

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

[expr.prim.req] / 5 :

প্রয়োজন শরীরের একটা ক্রম ধারণ করে প্রয়োজনীয়তা । এই প্রয়োজনীয়তাগুলি স্থানীয় প্যারামিটারগুলি, টেমপ্লেট প্যারামিটারগুলি এবং ঘেরের প্রসঙ্গে দেখানো অন্য কোনও ঘোষণাপত্রের উল্লেখ করতে পারে।

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