错误、漏洞、问题 - 页 1691

 
代码生成错误
void OnStart()
{
  int a = {0}; // code generation error
}
 
Andrey Dik:

CopySpread()函数对相应的图表周期 会产生什么价差值

不清楚它是平均数、最小数还是最大值,函数的帮助也没有说什么。

 
Andrey Dik:

CopySpread()函数对相应的图表周期 会产生什么价差值

不清楚它是平均数、最小数还是最大值,函数的帮助也没有说什么。

在哪里,在账户或测试器中
 
Alexander Bereznyak:
其中,在账户或测试器中
这两点在参考文献中都没有。
 

对具有相同参数的重载函数 的模棱两可的调用

class A
{
public:  
//  void func( const int ) const {} // если заменить на это - будет компилироваться
  void func( const int ) {}

//  void func( const int& ) const {} // если заменить на это - будет компилироваться
  void func( const int& ) {}
};

void OnStart()
{
  A a;

  a.func(0);  

  int i1 = 0;
  a.func(i1);  

  const int i2 = 0;
  a.func(i2); // 'func' - ambiguous call to overloaded function with the same parameters  
}

这是一个误解还是一个错误?

 
fxsaber:

这是我的误解还是一个错误?

我的理解是,这段代码在两种情况下的表现应该是一样的。
 
fxsaber:

对具有相同参数的重载函数的模棱两可的调用

这是一个误解还是一个错误?

误解。

好了,就这样吧,我已经回答了。))))

 
Комбинатор:
根据我的理解,这段代码在两种情况下的表现必须是一样的。

这也是我的想法。

谢尔盖-弗拉基米罗夫

误解。

好了,就这样吧,我已经回答了。))))

那个愚蠢的源代码例子花了很长时间来创建。在我创作的时候,我的幽默感几乎消失了。

 
fxsaber:

这个哑巴来源的例子花了很长时间来创建。在我创作的时候,我的幽默感几乎消失了。

(笑) 好的。)

在所有三个版本的调用中,都无法理解参数是通过值还是通过引用传递的,所以编译器无法选择调用哪个函数。而const修饰符可以重载它们:void f(){}和void f() const {}是不同的函数。如果在你的例子中,你将其中一个方法声明为常量,那么不确定性将消失:编译器将根据是否从常量对象中调用来选择所需的方法(在你的例子中参数的类型并不重要)。

你的对象a不是一个常数,所以没有const的方法将被调用三次。如果你把一个对象声明为常量(A const a;),那么一个常量方法 就会被调用。

看看输出会是什么。

class A
{
public:  
  void func() {Print("Non const");}
  void func() const {Print("Const");}
};

void OnStart()
{
        A a;
        A const b;
        
        a.func();
        b.func();
}
 
Sergei Vladimirov:

很好。)

在所有三种变体的调用中,不可能理解一个参数是通过值还是通过引用传递的,这就是为什么编译器不能选择调用哪个函数。而const修饰符对它们进行了重载:void f(){}和void f() const {}是不同的函数。如果在你的例子中,你将其中一个方法声明为常量,那么不确定性将消失:编译器将根据是否从常量对象中调用来选择所需的方法(在你的例子中参数的类型并不重要)。

你的对象a不是一个常数,所以没有const的方法将被调用三次。如果你把对象声明为常量(A const a;),那么常量方法 将被调用。

你会先运行它。错误只出现在这里
const int i2 = 0;
a.func(i2); // 'func' - ambiguous call to overloaded function with the same parameters

在此之前的所有电话都顺利通过,没有任何问题。

看看它打印出了什么。

这是来自另一个主题。