gpt4 book ai didi

c++ - 为什么我可以在 decltype() 中使用私有(private)默认构造函数?

转载 作者:可可西里 更新时间:2023-11-01 18:26:23 25 4
gpt4 key购买 nike

看代码:

#include <iostream>
#include <utility>

class test
{
private:
test() { }
public:
test foo() { return *this; }

static const char *name() { return "test"; }
};

int main()
{
std::cout << decltype(test().foo())::name() << std::endl; // 1
std::cout << decltype(std::declval<test>().foo())::name() << std::endl; // 2
}

我预计 //1 行无法编译,因为 test 的默认构造函数是私有(private)的。

However, it works well.我难以置信地在我的 g++ 4.8.3 上用 -Wall -Wextra -Werror -pedantic 测试了它,但它运行良好,没有任何错误或警告。

(此外,它似乎也适用于 GCC 4.9.1。)

来自 this page ,我想如果表达式未被评估,我们可以使用私有(private)默认构造函数。因此,我测试了以下内容以进行检查。

#include <iostream>
#include <utility>

class test
{
private:
test(int) { }
public:
test foo() { return *this; }

static const char *name() { return "test"; }
};

int main()
{
std::cout << decltype(test().foo())::name() << std::endl; // 1
std::cout << decltype(std::declval<test>().foo())::name() << std::endl; // 2
}

(live example)

正如预期的那样,它没有被编译。

但是.... 为什么?? 这怎么可能?我们可以在未评估的表达式中使用 private 成员吗?还是默认构造函数有特殊规则?你能解释一下为什么吗?

最佳答案

它不应该编译。 C++11 [class.temporary] 关于创建临时对象有这样的说法:

12.2/1 Even when the creation of the temporary object is unevaluated or otherwise avoided, all the semantic restrictions shall be respected as if the temporary object had been created and later destroyed. [ Note: even if there is no call to the destructor or copy/move constructor, all the semantic restrictions, such as accessibility and whether the function is deleted, shall be satisfied. However, in the special case of a function call used as the operand of a decltype-specifier, no temporary is introduced, so the foregoing does not apply to the prvalue of any such function call. — end note ]

因此,即使未计算,您仍然受到创建和销毁临时对象所需的任何函数(包括构造函数)的可访问性的限制。注释的最后一句话阐明了像 declval 这样的函数可以用来避免这个障碍。

关于c++ - 为什么我可以在 decltype() 中使用私有(private)默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25663642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com