这段代码发生了什么?太令人困惑了.
#include <utility>
struct check
{
template <typename T>
auto foo() -> decltype(std::declval<T>().value, void())
{
static_assert(T{}.value == 10, "Incorrect value");
}
} var;
int main()
{
struct apple
{
int value{10};
};
var.foo<apple>();
}
Run Code Online (Sandbox Code Playgroud)
特别是它所拥有的部分->以及之后的一切.
chr*_*ris 10
让我们一点一点地进行.
auto foo() -> decltype(std::declval<T>().value, void())
Run Code Online (Sandbox Code Playgroud)
这是一种尾随返回类型.允许使用参数,但这不是必需的.我猜它写得更清楚.decltype查找内部表达式的类型,但实际上并未计算该表达式.std::declval用于创建传递给它的类型的实例.这里使用逗号运算符来生成整体返回类型void,因为逗号运算符计算左侧,抛出它,计算右侧,然后返回.
第一部分创建了一种SFINAE(虽然我从来没有看到它像这样使用).例如,如果你有过载foo是做了同样用value2代替value,就没有含糊其调用.见这里的我是什么意思.将它与这一个进行比较,它只有一个返回类型void并导致错误.
static_assert(T{}.value == 10, "Incorrect value");
Run Code Online (Sandbox Code Playgroud)
此行确保T其value成员的值初始化实例的值为10.如果不是,则生成具有该文本的编译器错误.
} var;
Run Code Online (Sandbox Code Playgroud)
这只是该类使用的全局对象.
struct apple
{
int value{10};
};
Run Code Online (Sandbox Code Playgroud)
这是一个用它来测试它的示例类.它有一个value成员,并且该成员在值初始化的实例中为10(默认初始化也是如此).
var.foo<apple>();
Run Code Online (Sandbox Code Playgroud)
这只是调用函数.
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |