给定所有这三个函数,这个调用是不明确的。 int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); 除去f( int )会导致Clang和GCC优先于左值引用的右值引用。 但相反,删除任何引用重载都会导致f( int )模糊。 重载parsing通常是用严格的偏序来完成的,但是int似乎相当于两个不相等的东西。 这里的规则是什么? 我似乎记得有关这方面的缺陷报告。 在未来的标准中, int &&可能比int更int吗? 引用必须绑定到初始化程序,而对象types不是那么受限制。 因此, T与T &&之间的重载可能有效地意味着“如果给予所有权,则使用现有对象,否则复制”。 (这与纯传值类似,但是节省了移动的开销)。由于这些编译器当前正在工作,所以这必须通过重载T const &和T && ,并明确复制来完成。 但我甚至不确定这是否是严格的标准。
例如,Java自己的String.format()支持可变数目的参数。 String.format("Hello %s! ABC %d!", "World", 123); //=> Hello World! ABC 123! 我怎样才能让我自己的函数接受可变数目的参数? 后续问题: 我真的想为此做一个方便的捷径: System.out.println( String.format("…", a, b, c) ); 所以我可以把它称为不那么冗长的东西: print("…", a, b, c); 我怎样才能做到这一点?
我正在把我的一些阶级从吸收者和制定者的广泛使用改变为对属性更为pythonic的使用。 但是现在我被卡住了,因为我之前的一些getter或setter会调用基类的相应方法,然后执行其他的操作。 但是,怎样才能完成属性? 如何在父类中调用属性getter或setter? 当然,调用属性本身会给出无限recursion。 class Foo(object): @property def bar(self): return 5 @bar.setter def bar(self, a): print a class FooBar(Foo): @property def bar(self): # return the same value # as in the base class return self.bar # –> recursion! @bar.setter def bar(self, c): # perform the same action # as in the base class self.bar […]
我不明白为什么构造函数与参数Double[] ? using System.Collections.Generic; using System.Linq; using System.Text; namespace MyConsoleApp { class Program { static void Main(string[] args) { D myD = new D(null); Console.ReadLine(); } } public class D { public D(object o) { Console.WriteLine("Object"); } public D(double[] array) { Console.WriteLine("Array"); } public D(int i) { Console.WriteLine("Int"); } } } 我认为,因为第一个构造函数采用引用types的参数。 带引用参数的第一个构造函数,因为null是引用types的默认值。 但我不明白为什么不object ,这也是一个参考types。
在下面的代码中,对foo的第一个调用是不明确的,因此无法编译。 第二,在lambda之前加上+ ,parsing为函数指针重载。 #include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main () { foo( [](){} ); // ambiguous foo( +[](){} ); // not ambiguous (calls the function pointer overload) } 在这里做的记号是什么?
我对Java的可变参数方法有些困惑: public static int sum(int …a) { return 0; } public static double sum(double …a) { return 0.0; } 当我试图在不传递任何参数的情况下调用sum() ,调用方法的int版本。 我不明白为什么; 通常编译器必须引发错误。 相比之下,当我尝试不带任何参数地调用sum时,下面这段代码就会产生编译器错误: public static int sum(int …a) { return 0; } public static boolean sum(boolean …a) { return true; }
我有一个小程序: #include<iostream> using namespace std; void f(int) { cout << "int\n"; } void f(short) { cout << "short\n"; } int main(void){ char c = 0; f(c); return 0; } 它打印int 。 我觉得,如果这是因为“整数推广”,为什么不是short优先? 我也知道整数提升发生在一个expression式(如A = B)。 但是我没有expressionf(),调用f(),对吧? 如果这与重载parsing规则有关,为什么传递char到f会导致编译器宁愿int short ? 如果我删除f(int) ,那么f(c)将调用f(short) ! 所以总的来说,我的问题是,它与“整数提升”还是“超载parsing规则”有关? 为什么?
为什么只通过改变返回types来重载一个函数是不可能的? 在未来的Java版本中会有所改变吗? 顺便说一句,仅供参考,这是可能的C ++?
main() 2个有效版本存在于C++ : int main() // version 1 int main(int argc, char **argv) // version 2 但是两个超载不能同时并存。 为什么不? (可能的用例:从terminal运行程序时,如果没有parameter passing,则调用第一个版本,否则第二个版本是。) 编译器是否执行特殊的检查以允许每个二进制只有一个版本?
我已经放弃了所有能够在PHP中重载我的构造函数的希望,所以我真正想知道的是为什么 。 有甚么理由呢? 它创build固有的错误代码? 是不是被广泛接受的语言devise不允许它,或者比PHP更好的其他语言?