একটি মুছে ফেলা ফাংশন অন্তর্নিহিত ইনলাইন
(বিদ্যমান উত্তরের সাথে সংযোজন)
... এবং মুছে ফেলা ফাংশনটির প্রথম ঘোষণাটি হবে (ফাংশন টেম্পলেটগুলির স্পষ্ট বিশেষায়ন মুছে ফেলা ব্যতীত - মুছা বিশেষকরণের প্রথম ঘোষণার সময় হওয়া উচিত), যার অর্থ আপনি কোনও কার্য ঘোষণা করতে পারবেন না এবং পরে এটি মুছবেন, বলুন, একটি অনুবাদ ইউনিট এর সংজ্ঞা স্থানীয়।
Citing [dcl.fct.def.delete] / 4 :
একটি মুছে ফেলা ফাংশন অন্তর্নিহিত ইনলাইন। ( নোট: এক-ডেফিনেশনের শাসন ( [basic.def.odr] ) মোছা হয়েছে সংজ্ঞা প্রযোজ্য -। শেষ নোট ] একটি মুছে দেওয়া একটি ফাংশন সংজ্ঞা ফাংশনের প্রথম ঘোষণা বা ফাংশন টেমপ্লেটের একটি সুনির্দিষ্ট বিশেষজ্ঞতা জন্য, হইবে , সেই বিশেষজ্ঞের প্রথম ঘোষণা। [উদাহরণ:
struct sometype {
sometype();
};
sometype::sometype() = delete; // ill-formed; not first declaration
- শেষ উদাহরণ )
মুছে ফেলা সংজ্ঞা সহ একটি প্রাথমিক ফাংশন টেম্পলেট বিশেষ করা যেতে পারে
থাম্বের সাধারণ নিয়ম থাকা সত্ত্বেও ফাংশন টেম্পলেটগুলির বিশেষায়িতকরণ এড়াতে হয় কারণ ওভারলোড রেজোলিউশনের প্রথম ধাপে বিশেষীকরণগুলি অংশ নেয় না, এমন কিছু যুক্তি রয়েছে যেখানে এটি কার্যকর হতে পারে। যেমন ক ব্যবহারের সময় কোনও প্রকারের সাথে কোনও সংজ্ঞা ছাড়াই অ-ওভারলোডেড প্রাথমিক ফাংশন টেম্পলেট করার সময় যা কোনওরূপে অন্যথায় ম্যাচ-বাই-রূপান্তর ওভারলোডকে স্পষ্টত রূপান্তর করতে চায় না; অর্থাত্, অ-সংজ্ঞায়িত, অ-ওভারলোডেড প্রাথমিক ফাংশন টেম্পলেটটির স্পষ্টতীকরণের ক্ষেত্রে সঠিক ধরণের ম্যাচগুলি প্রয়োগ করে সুস্পষ্টভাবে সংখ্যালঘ্ন-রূপান্তর ম্যাচগুলি সরিয়ে ফেলার জন্য।
সি ++ 11 এর মুছে ফাংশন ধারণার আগে, কেউ কেবল প্রাথমিক ফাংশন টেম্পলেটটির সংজ্ঞা বাদ দিয়ে এটি করতে পারে, তবে এটি অস্পষ্ট অনির্ধারিত রেফারেন্স ত্রুটি দিয়েছে যা প্রাথমিক ফাংশন টেমপ্লেটের লেখকের কাছ থেকে কোনও উদ্দেশ্যমূলক উদ্দেশ্য দেয় নি (উদ্দেশ্যমূলকভাবে বাদ দেওয়া হয়েছে) ?)। যদি আমরা পরিবর্তে প্রাথমিক ফাংশন টেম্পলেটটি মুছে ফেলি, তত্ক্ষণাত যদি কোনও উপযুক্ত স্পষ্ট বিশেষীকরণ না পাওয়া যায় ত্রুটি বার্তাগুলি খুব সুন্দর হয়ে ওঠে এবং এটিও দেখায় যে প্রাথমিক ফাংশন টেমপ্লেটের সংজ্ঞাটি বাদ দেওয়া / মুছে ফেলা ইচ্ছাকৃত ছিল।
#include <iostream>
#include <string>
template< typename T >
void use_only_explicit_specializations(T t);
template<>
void use_only_explicit_specializations<int>(int t) {
std::cout << "int: " << t;
}
int main()
{
const int num = 42;
const std::string str = "foo";
use_only_explicit_specializations(num); // int: 42
//use_only_explicit_specializations(str); // undefined reference to `void use_only_explicit_specializations< ...
}
যাইহোক, উপরের প্রাথমিক ফাংশন টেম্পলেটটির জন্য কেবল একটি সংজ্ঞা বাদ দেওয়ার পরিবর্তে কোনও স্পষ্টতীকরণের সাথে মেলে না এমন একটি অস্পষ্ট অনির্ধারিত রেফারেন্স ত্রুটি প্রদান করে, প্রাথমিক টেম্পলেট সংজ্ঞাটি মোছা যাবে:
#include <iostream>
#include <string>
template< typename T >
void use_only_explicit_specializations(T t) = delete;
template<>
void use_only_explicit_specializations<int>(int t) {
std::cout << "int: " << t;
}
int main()
{
const int num = 42;
const std::string str = "foo";
use_only_explicit_specializations(num); // int: 42
use_only_explicit_specializations(str);
/* error: call to deleted function 'use_only_explicit_specializations'
note: candidate function [with T = std::__1::basic_string<char>] has
been explicitly deleted
void use_only_explicit_specializations(T t) = delete; */
}
আরও বেশি পঠনযোগ্য ত্রুটি বার্তা সরবরাহ করা, যেখানে মোছার উদ্দেশ্যটিও স্পষ্টভাবে দৃশ্যমান (যেখানে একটি অপরিজ্ঞাত রেফারেন্স ত্রুটি বিকাশকারীকে এটি একটি অচিন্তিত ভুল ভাবতে পারে)।
কেন আমরা কখনই এই কৌশলটি ব্যবহার করতে চাইব? আবার, স্পষ্টত বিশেষায়িতকরণ অন্তর্নিহিত রূপান্তরগুলি সুস্পষ্টভাবে মুছে ফেলার জন্য কার্যকর হতে পারে ।
#include <cstdint>
#include <iostream>
void warning_at_best(int8_t num) {
std::cout << "I better use -Werror and -pedantic... " << +num << "\n";
}
template< typename T >
void only_for_signed(T t) = delete;
template<>
void only_for_signed<int8_t>(int8_t t) {
std::cout << "UB safe! 1 byte, " << +t << "\n";
}
template<>
void only_for_signed<int16_t>(int16_t t) {
std::cout << "UB safe! 2 bytes, " << +t << "\n";
}
int main()
{
const int8_t a = 42;
const uint8_t b = 255U;
const int16_t c = 255;
const float d = 200.F;
warning_at_best(a); // 42
warning_at_best(b); // implementation-defined behaviour, no diagnostic required
warning_at_best(c); // narrowing, -Wconstant-conversion warning
warning_at_best(d); // undefined behaviour!
only_for_signed(a);
only_for_signed(c);
//only_for_signed(b);
/* error: call to deleted function 'only_for_signed'
note: candidate function [with T = unsigned char]
has been explicitly deleted
void only_for_signed(T t) = delete; */
//only_for_signed(d);
/* error: call to deleted function 'only_for_signed'
note: candidate function [with T = float]
has been explicitly deleted
void only_for_signed(T t) = delete; */
}