我很困惑为什么我正在阅读的书说以下两个声明具有相同的效果:
template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(b<a?a:b);
template<typename T1, typename T2> auto max (T1 a, T2 b) -> decltype(true?a:b);
Run Code Online (Sandbox Code Playgroud)
在第一个声明中,返回类型max(a, b)可以是类型a或类型b.在第二个声明中,返回类型是类型a.两个声明如何具有相同的效果?
以下是我读到的文章:
当同时定义了自由运算符函数和成员运算符函数时,使用哪一个进行比较?
#include <iostream>
class A;
class B;
bool operator==(const A &a, const B &b){ return true; };
class A
{
public:
bool operator==( const B &rhs ){ return false; };
};
class B
{
};
int main( int argc, char **argv )
{
A a;
B b;
if( a == b )
{
std::cout << "a==b" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
我运行了几次代码,似乎成员运算符胜出了。总是这样吗?
我在单个 cpp 文件中有以下代码:
class Base
{
public:
//constructor
Base() = delete;
};
class Derived : public Base
{
public:
//copy constructor
Derived( const Derived & other ){};
};
int main( int argc, char* argv[] )
{
//empty
}
Run Code Online (Sandbox Code Playgroud)
但是编译cpp文件会报错
exp.cpp:在复制构造函数'Derived::Derived(const Derived&)'中:
exp.cpp:15:37: 错误:使用已删除的函数'Base::Base()'
Derived(const Derived & other){};
exp.cpp:7:5: 注意:这里声明
Base() = delete;
^~~~
我不明白为什么。当您为派生类定义复制构造函数时,基类默认构造函数如何发挥作用?