সি ++ তে, যদি থ্রো একটি অভিব্যক্তি হয় তবে এর প্রকারটি কী?


115

আমি এটিকে পুনর্বিবেচনার জন্য আমার একটি সংক্ষিপ্ত বিবরণে তুলেছি:

http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/

মূলত, লেখক সি ++ এ এটি উল্লেখ করেছেন:

throw "error"

একটি অভিব্যক্তি। এটি মূলত মূল পাঠ্য এবং ব্যাকরণ উভয়ই সি ++ স্ট্যান্ডার্ডে মোটামুটি স্পষ্টভাবে বর্ণিত। তবে, যা পরিষ্কার নয় (আমার কাছে কমপক্ষে) তা প্রকাশের ধরণটি কী? আমি " void" অনুমান করেছি , তবে জি ++ ৪.৪.০ এবং কমেউ এই কোডটি পেয়েছি :

    void f() {
    }

    struct S {};

    int main() {
        int x = 1;
        const char * p1 = x == 1 ? "foo" : throw S();  // 1
        const char * p2 = x == 1 ? "foo" : f();        // 2
    }

সংকলকগুলির মধ্যে // 1 এর সাথে কোনও সমস্যা ছিল না তবে // 2 এ বারফিড হয়েছে কারণ শর্তসাপেক্ষ অপারেটরের ধরণগুলি পৃথক। সুতরাং একটি throwপ্রকাশের ধরণটি বাতিল মনে হয় না।

তো এটা কি?

যদি আপনি উত্তর দেন, দয়া করে স্ট্যান্ডার্ডের উদ্ধৃতি সহ আপনার বিবৃতি ব্যাক আপ করুন।


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

c++  throw 

10
+1 দুর্দান্ত প্রশ্ন। এবং এটি পরীক্ষা করার একটি চতুর উপায়।
জেরেমি পাওয়েল

1
লিঙ্কটি এটিকে মোটামুটি পরিষ্কার করে মনে হচ্ছে যে প্রকারটি যা যা করা দরকার তা সংকলক দ্বারা নির্ধারিত হয়।
ড্রিমন

সংযুক্ত নিবন্ধটি আমার মনে হয়েছে যেহেতু আমি এটির দিকে নজর রেখেছি আপডেট হয়েছে এবং আমি নিশ্চিত যে এটি বাস্তবেই রয়েছে। তবে, আমি এটি স্ট্যান্ডার্ডে খুঁজে পাচ্ছি না।

এবং সম্ভবত না - ডাবল ডি = নিক্ষেপ "ফু"; জি + = এর সাথে একটি ত্রুটি এটি (কমোউয়ের সাথে এটি পরীক্ষা করে দেখেনি)

+1 আমি উত্তর জানতে আগ্রহী।
আরাক

উত্তর:


96

স্ট্যান্ডার্ড অনুসারে 5.16 অনুচ্ছেদ 2 প্রথম পয়েন্ট, "দ্বিতীয় বা তৃতীয় অপারেন্ড (তবে উভয়ই নয়) একটি নিক্ষেপ-এক্সপ্রেশন (15.1); ফলাফল অন্যটির ধরণের এবং একটি মূল্যায়ন।" অতএব, শর্তসাপেক্ষ অপারেটর কোন ধরণের থ্রো-এক্সপ্রেশনটি কী তা বিবেচনা করে না তবে কেবল অন্য প্রকারটি ব্যবহার করবে।

প্রকৃতপক্ষে, 15.1, অনুচ্ছেদ 1 স্পষ্টভাবে বলেছে "একটি থ্রো-এক্সপ্রেশনটি হ'ল বাতিল oid"


9
ঠিক আছে - আমি মনে করি আমাদের একজন বিজয়ী আছে।

নোট করুন যে থ্রো-এক্সপ্রেশন হ'ল এসাইনমেন্ট-এক্সপ্রেশন। সুতরাং এগুলি বেশিরভাগ অপারেটরের পক্ষে যুক্তি হিসাবে একটি বাক্য গঠন ত্রুটি। স্পষ্টতই, আপনি এগুলি বন্ধনীতে লুকিয়ে রাখতে পারেন, তবে যদি সেগুলি উপেক্ষা করা না হয় (উদাহরণস্বরূপ বিল্টিন অপারেটরের প্রথম যুক্তি), এটি একটি টাইপ ত্রুটি।
এপ্রোগ্রামার

4
আমাকে যা সত্যই অবাক করে তারা হ'ল তারা এই কেসটি সম্পর্কে ভেবেছিল এবং যুক্তিসঙ্গত কিছু ঘটায়।
সর্বস্বীকৃত

31

"একটি থ্রো-এক্সপ্রেশনটি বাতিল টাইপের"

আইএসও 14882 ধারা 15


তারপরে g ++ এবং Comeau উভয়ই আমার // 1 মামলার ত্রুটি না দেওয়ার জন্য কি খালি?

2
@ নীল, সত্যিকার অর্থে নয় কারণ সি ++ / 5.16 / 2 অনুসারে শর্তসাপেক্ষ অপারেটরের দ্বিতীয় এবং তৃতীয় void
অপারেশনগুলি

13

[Expr.cond.2] (শর্তসাপেক্ষ অপারেটর ?:) থেকে:

যদি দ্বিতীয় বা তৃতীয় অপারেন্ডের টাইপ হয় (সম্ভবত সিভি-কোয়ালি fi এড) শূন্য থাকে, তবে লভ্যালু-থেকে-মূল্য, অ্যারে-টু-পয়েন্টার এবং ফাংশন-টু-পয়েন্টার স্ট্যান্ডার্ড রূপান্তরগুলি দ্বিতীয় এবং তৃতীয় অপারেন্ডগুলিতে সঞ্চালিত হয়, এবং নিম্নলিখিতগুলির মধ্যে একটিতে রাখা উচিত:

- দ্বিতীয় বা তৃতীয় অপারেন্ড (তবে উভয়ই নয়) একটি ছোঁড়া-প্রকাশ; ফলাফল অন্যটির ধরণের এবং এটি একটি মূল্যমান।

- দ্বিতীয় এবং তৃতীয় অপারেশন উভয়েরই টাইপ অকার্যকর রয়েছে; ফলাফল টাইপ অকার্যকর এবং একটি মূল্য। [দ্রষ্টব্য: এতে উভয় অপারেশন থ্রো-এক্সপ্রেশন রয়েছে এমন ক্ষেত্রে অন্তর্ভুক্ত রয়েছে। - শেষ নোট]

সুতরাং, আপনার সাথে //1প্রথম ক্ষেত্রে ছিল, এর সাথে //2, আপনি "নিম্নলিখিতগুলির মধ্যে একটিকে ধরে রাখতে হবে" লঙ্ঘন করছেন, যেহেতু তাদের ক্ষেত্রে কেউই করেন না।


3

আপনার কাছে এটি প্রকারের এক প্রকার মুছতে পারে :

template<typename T>
struct PrintType;

int main()
{
    PrintType<decltype(throw "error")> a; 
}

মূলত এর বাস্তবায়নের অভাবে PrintTypeসংকলনের ত্রুটি প্রতিবেদনটি বলে:

অপরিবর্তিত টেম্পলেট অন্তর্ভুক্ত ইনস্ট্যান্টেশন PrintType<void>

সুতরাং আমরা প্রকৃতপক্ষে যাচাই করতে পারি যে throwএক্সপ্রেশনগুলি প্রকারের void(এবং হ্যাঁ, অন্যান্য উত্তরে উল্লিখিত স্ট্যান্ডার্ড উক্তিগুলি যাচাই করে যে এটি কোনও বাস্তবায়ন নির্দিষ্ট ফলাফল নয় - যদিও জিসিসি মূল্যবান তথ্য প্রিন্ট করতে একটি কঠিন সময় রয়েছে)

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