নিম্নলিখিত কোডটি সি ++ 17 মোডে ক্ল্যাং-ট্রাঙ্কের সাথে জরিমানা সংকলন করে তবে সি ++ 2 এ (আসন্ন সি ++ 20) মোডে বিরতি দেয়:
// Meta struct describing the result of a comparison
struct Meta {};
struct Foo {
Meta operator==(const Foo&) {return Meta{};}
Meta operator!=(const Foo&) {return Meta{};}
};
int main()
{
Meta res = (Foo{} != Foo{});
}
এটি জিসিসি-ট্রাঙ্ক বা ঝনঝন 9.0.0 এর সাথেও সূক্ষ্ম সংকলন করে: https://godbolt.org/z/8GGT78
ঝনঝন-ট্রাঙ্ক এবং ত্রুটি -std=c++2a
:
<source>:12:19: error: use of overloaded operator '!=' is ambiguous (with operand types 'Foo' and 'Foo')
Meta res = (f != g);
~ ^ ~
<source>:6:10: note: candidate function
Meta operator!=(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function
Meta operator==(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function (with reversed parameter order)
আমি বুঝতে পেরেছি যে সি ++ 20 কেবলমাত্র ওভারলোডের পক্ষে এটি সম্ভব operator==
করবে operator!=
এবং এর ফলাফলটি উপেক্ষা করে সংকলক স্বয়ংক্রিয়ভাবে উত্পন্ন হবে operator==
। যতদূর আমি বুঝতে পারি, এটি কেবলমাত্র রিটার্নের টাইপ হিসাবে কাজ করে bool
।
সমস্যা উৎস Eigen আমরা অপারেটার একটি সেট ঘোষণা যে ==
, !=
, <
, ... মধ্যে Array
বস্তু বা Array
এবং Scalars, যা রিটার্ন (একটি অভিব্যক্তি) এর একটি অ্যারের bool
(যা পরে উপাদান ভিত্তিক অ্যাক্সেস করা যেতে পারে, বা অন্যথায় ব্যবহৃত )। যেমন,
#include <Eigen/Core>
int main()
{
Eigen::ArrayXd a(10);
a.setRandom();
return (a != 0.0).any();
}
আমার উপরের উদাহরণের বিপরীতে এটি এমনকি জিসিসি-ট্রাঙ্কের সাথে ব্যর্থ হয়: https://godbolt.org/z/RWktKs । আমি এটিকে এখনও কোনও অ-আইগান উদাহরণে হ্রাস করতে পরিচালনা করতে পারি নি, যা ক্ল্যাং-ট্রাঙ্ক এবং জিসিসি-ট্রাঙ্ক উভয় ক্ষেত্রেই ব্যর্থ হয় (শীর্ষে উদাহরণটি বেশ সরলীকৃত)।
সম্পর্কিত ইস্যু প্রতিবেদন: https://gitlab.com/libeigen/eigen/issues/1833
আমার আসল প্রশ্ন: এটি কি আসলেই সি ++ ২০ এর একটি ব্রেকিং পরিবর্তন (এবং মেটা-অবজেক্টগুলি ফেরত দিতে তুলনামূলক অপারেটরদের ওভারলোড করার কোনও সম্ভাবনা রয়েছে), বা ঝড় / জিসিসি-তে এটি সম্ভবত রিগ্রেশন হওয়ার সম্ভাবনা বেশি?