【C++】C++最麻烦的解释——针对存在二义性的C++语句,只要它有可能被解释成函数声明,编译器就肯定将其解释成函数声明

本文探讨了C++中如何通过为可能被视为函数声明的临时函数对象命名,避免编译器歧义,重点介绍了使用额外圆括号和统计初始化语法来确保代码正确解析。
针对存在二义性的C++语句,只要它有可能被解释成函数声明,编译器就肯定将其解释成函数声明。为临时函数对象命名即可解决问题,做法是多用一对圆括号,或采用新式的统计初始化语法(列表初始化)。
#include <QCoreApplication>
#include <QDebug>
#include <thread>

class ATestClass1
{
public:
    static ATestClass1 &getInstance()
    {
        static ATestClass1 instance;
        return instance;
    }

    ~ATestClass1()
    {
        qDebug() << "ATestClass dector";
    }

private:
    ATestClass1()
    {
        qDebug() << "ATestClass ctor";
    }
};

class ATestClass2
{
public:
    void operator() ()
    {
        qDebug() << "operator()";
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    ATestClass1 testClass1_1();
    void func1();
    ATestClass1 func2();
    //ATestClass1 testClass1_2;      // error: 'ATestClass1::ATestClass1()' is private

    std::thread thread1(ATestClass2());     // 会被解释成函数声明(接收的参数是函数指针,所指向的函数没有参数传入,返回ATestClass2对象)
    std::thread thread2((ATestClass2()));
    std::thread thread3{ATestClass2()};

    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值