คำถามติดแท็ก implicit-conversion

การแปลงออบเจ็กต์ตัวแปรหรือค่าจากประเภทหนึ่งไปเป็นอีกประเภทหนึ่งเพื่อให้เป็นไปตามข้อ จำกัด ประเภทโดยไม่ต้องร้องขอการแปลงนั้นโดยเฉพาะผ่านไวยากรณ์ของภาษา

2
สกาล่ามองหาการปลูกฝังที่ไหน?
นัยคำถามที่จะมาใหม่เพื่อ Scala น่าจะเป็น: ที่ไม่ดูคอมไพเลอร์สำหรับ implicits? ฉันหมายถึงโดยปริยายเพราะคำถามดูเหมือนจะไม่ได้เกิดขึ้นอย่างสมบูรณ์ราวกับว่าไม่มีคำพูด :-) ตัวอย่างเช่นค่าสำหรับintegralด้านล่างมาจากไหน scala> import scala.math._ import scala.math._ scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)} foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit scala> foo(0) scala.math.Numeric$IntIsIntegral$@3dbea611 scala> foo(0L) scala.math.Numeric$LongIsIntegral$@48c610af คำถามอีกข้อที่ติดตามผู้ที่ตัดสินใจเรียนรู้คำตอบของคำถามแรกคือผู้แปลเลือกว่าจะใช้แบบไหนโดยปริยายในบางสถานการณ์ที่มีความคลุมเครือชัดเจน ยกตัวอย่างเช่นscala.PredefกำหนดสองแปลงจากString: หนึ่งไปWrappedStringและอื่น ๆ StringOpsเพื่อ ทั้งชั้นเรียน แต่แบ่งปันมากในวิธีการดังนั้นทำไมไม่ Scala บ่นเกี่ยวกับความคลุมเครือเมื่อพูดเรียกmap? หมายเหตุ:คำถามนี้ได้รับแรงบันดาลใจจากคำถามอื่น ๆ นี้โดยหวังว่าจะสามารถระบุปัญหาได้ในลักษณะทั่วไป ตัวอย่างถูกคัดลอกมาจากที่นั่นเพราะมันถูกอ้างถึงในคำตอบ

4
การแปลงโดยนัยของ Objective-C สูญเสียความแม่นยำจำนวนเต็ม 'NSUInteger' (หรือที่รู้จักว่า 'ไม่ได้ลงนามยาว') เป็นคำเตือน 'int'
ฉันทำงานผ่านแบบฝึกหัดและได้รับคำเตือนว่า: การแปลงโดยนัยสูญเสียความแม่นยำของจำนวนเต็ม: 'NSUInteger' (aka 'long unsigned long') ถึง 'int' #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSArray *myColors; int i; int count; myColors = @[@"Red", @"Green", @"Blue", @"Yellow"]; count = myColors.count; // <<< issue warning here for (i = 0; i < count; i++) …


7
เหตุใดฉันจึงผ่าน 1 เป็นตัวย่อ แต่ไม่ใช่ตัวแปร int i
ทำไมการเขียนครั้งแรกและครั้งที่สองถึงทำงาน แต่ไม่ใช่ครั้งสุดท้าย มีวิธีที่ฉันสามารถอนุญาตให้ทั้ง 3 คนและตรวจพบว่าเป็น 1, (int) 1 หรือฉันผ่านไปแล้วหรือไม่? และทำไมคนหนึ่งถึงได้รับอนุญาต แต่คนสุดท้าย? การได้รับอนุญาตครั้งที่สอง แต่ไม่ใช่ครั้งสุดท้ายที่พัดใจของฉัน การสาธิตเพื่อแสดงข้อผิดพลาดในการคอมไพล์ using System; class Program { public static void Write(short v) { } static void Main(string[] args) { Write(1);//ok Write((int)1);//ok int i=1; Write(i);//error!? } }

12
เราสามารถกำหนดการแปลงโดยนัยของ enums ใน c # ได้หรือไม่?
เป็นไปได้หรือไม่ที่จะกำหนดการแปลง enums โดยปริยายใน c # สิ่งที่สามารถบรรลุนี้? public enum MyEnum { one = 1, two = 2 } MyEnum number = MyEnum.one; long i = number; ถ้าไม่เพราะเหตุใด

5
`is_base_of` ทำงานอย่างไร
รหัสต่อไปนี้ทำงานอย่างไร typedef char (&yes)[1]; typedef char (&no)[2]; template <typename B, typename D> struct Host { operator B*() const; operator D*(); }; template <typename B, typename D> struct is_base_of { template <typename T> static yes check(D*, T); static no check(B*, int); static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes); }; …

2
ป้องกันไม่ให้ฟังก์ชันรับ const std :: string & จากการยอมรับ 0
มีค่าหนึ่งพันคำ: #include<string> #include<iostream> class SayWhat { public: SayWhat& operator[](const std::string& s) { std::cout<<"here\n"; // To make sure we fail on function entry std::cout<<s<<"\n"; return *this; } }; int main() { SayWhat ohNo; // ohNo[1]; // Does not compile. Logic prevails. ohNo[0]; // you didn't! this compiles. return 0; } คอมไพเลอร์ไม่ได้บ่นเมื่อผ่านหมายเลข …

3
การแปลงโดยนัยกับคลาสประเภท
ใน Scala เราสามารถใช้อย่างน้อยสองวิธีในการติดตั้งประเภทที่มีอยู่หรือแบบใหม่ สมมติว่าเราต้องการแสดงว่าบางสิ่งสามารถหาปริมาณได้โดยใช้Int. เราสามารถกำหนดลักษณะต่อไปนี้ การแปลงโดยนัย trait Quantifiable{ def quantify: Int } จากนั้นเราสามารถใช้การแปลงโดยนัยเพื่อหาจำนวนเช่น Strings and Lists implicit def string2quant(s: String) = new Quantifiable{ def quantify = s.size } implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{ val quantify = l.size } หลังจากนำเข้าสิ่งเหล่านี้เราสามารถเรียกใช้เมธอดquantifyในสตริงและรายการ quantifyโปรดทราบว่ารายการเชิงปริมาณเก็บความยาวของมันจึงหลีกเลี่ยงการสำรวจเส้นทางที่มีราคาแพงของรายการได้ที่โทรตามมากับ พิมพ์คลาส อีกทางเลือกหนึ่งคือการกำหนด "พยาน" Quantified[A]ที่ระบุว่าบางประเภทAสามารถหาปริมาณได้ trait Quantified[A] { def …


10
ทำไม printf (“% f”, 0); ให้พฤติกรรมที่ไม่ได้กำหนด?
คำสั่ง printf("%f\n",0.0f); พิมพ์ 0. อย่างไรก็ตามคำสั่ง printf("%f\n",0); พิมพ์ค่าสุ่ม ฉันรู้ว่าฉันกำลังแสดงพฤติกรรมบางอย่างที่ไม่ได้กำหนด แต่ฉันไม่สามารถหาสาเหตุได้โดยเฉพาะ ค่าทศนิยมที่บิตทั้งหมดเป็น 0 ยังคงใช้ได้floatโดยมีค่าเป็น 0 floatและintมีขนาดเท่ากันบนเครื่องของฉัน (หากเกี่ยวข้องกัน) เหตุใดการใช้ลิเทอรัลจำนวนเต็มแทนที่จะเป็นลิเทอรัลจุดลอยตัวจึงprintfทำให้เกิดพฤติกรรมนี้ ปล. พฤติกรรมเดียวกันนี้สามารถมองเห็นได้ถ้าฉันใช้ int i = 0; printf("%f\n", i);

4
การแปลงโดยปริยายไม่ได้รับอนุญาตเมื่อส่งคืน
#include <optional> bool f() { std::optional<int> opt; return opt; } ไม่ได้รวบรวม: 'return': cannot convert from 'std::optional<int>' to 'bool' การอ้างอิงการให้คำปรึกษาฉันคิดว่าจะหาคำอธิบาย แต่ฉันอ่านมันควรจะโอเค การแปลงโดยนัยจะดำเนินการทุกครั้งที่มีการใช้นิพจน์ประเภท T1 บางประเภทในบริบทที่ไม่ยอมรับประเภทนั้น แต่ยอมรับประเภท T2 บางประเภท โดยเฉพาะอย่างยิ่ง: เมื่อนิพจน์ใช้เป็นอาร์กิวเมนต์เมื่อเรียกใช้ฟังก์ชันที่ประกาศด้วย T2 เป็นพารามิเตอร์ เมื่อนิพจน์ถูกใช้เป็นตัวถูกดำเนินการกับตัวดำเนินการที่คาดว่า T2 เมื่อเริ่มต้นวัตถุใหม่ประเภท T2 รวมถึงคำสั่ง return ในฟังก์ชั่นการคืนค่า T2 เมื่อการแสดงออกที่ใช้ในงบสวิทช์ (T2 เป็นประเภทที่สำคัญ); เมื่อนิพจน์ถูกใช้ในคำสั่ง if หรือลูป (T2 คือบูล)

4
ทำไม const char * ไม่ต้องการตัวชี้ไปยังที่อยู่หน่วยความจำ
นี่อาจเป็นคำถามง่าย ๆ แต่ทำไม const char * ไม่จำเป็นต้องระบุที่อยู่หน่วยความจำ ตัวอย่าง: const char* a = "Anthony"; และไม่: const char *a = // Address to const char เหมือนประเภทอื่น ๆ

2
การโทรไปแลมบ์ดานั้นไม่ชัดเจนแม้จะระบุประเภทการคืนอย่างชัดเจน
ฟังก์ชั่นโอเวอร์โหลดควรใช้ทั้งฟังก์ชั่นในเนื่องจากประเภทของแลมบ์ดานั้นสามารถนำกลับมาใช้ใหม่ได้std::function(โปรดแก้ไขให้ฉันถ้าฉันผิด) คำถามคือ: ทำไมมีข้อผิดพลาดในการคอมไพล์ด้านล่าง กำหนดไว้หรือไม่ ( [&]() -> Type {}) โปรดทราบว่าสำหรับวิธีแก้ปัญหาปัจจุบันของฉันฉันต้องการการดักจับโดยอ้างอิงนั่นคือสาเหตุที่รหัสประกอบด้วยตรรกะสำหรับมัน ตัวอย่างต่อไปนี้อธิบายถึงปัญหา: #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified …

3
วิธีหลีกเลี่ยงการแปลงโดยนัยจากจำนวนเต็ม 0 ถึงตัวชี้เป็นองค์ประกอบของเวกเตอร์
มีสถานการณ์ที่ฉันต้องการรวบรวมชื่อโหนดทั้งหมดของพา ธ ไปยังคีย์ใน JSON พิจารณาเงื่อนไขของดัชนีอาเรย์ "0", "1" ด้วยเช่นกัน แต่มันก็ง่ายที่จะลืมเครื่องหมายคำพูดซึ่งจะนำไปสู่ความผิดพลาดเมื่อทำการอ้างอิง ดังนั้นฉันต้องการปฏิเสธสิ่งนี้ ตัวอย่าง: #include <vector> #include <iostream> int func(const std::vector<const char*>& pin) { return pin.size(); } int main() { // {"aname", "3", "path", "0"} wanted but this still compile std::cout << func({"aname", "3", "path", 0}) << std::endl; } ฉันพบและลองสิ่งนี้ฉันจะหลีกเลี่ยงการแปลงโดยนัยในฟังก์ชั่นที่ไม่ได้สร้างได้อย่างไร ดังต่อไปนี้: #include <vector> …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.