gpt4 book ai didi

c++ - 这是在 C++03 中执行 "Expression SFINAE"的有效方法吗?

转载 作者:可可西里 更新时间:2023-11-01 17:57:22 27 4
gpt4 key购买 nike

在 C++11 中,SFINAE 很容易判断一个表达式是否有效。例如,想象一下检查某些内容是否可流式传输:

template <typename T>
auto print_if_possible(std::ostream& os, const T& x)
-> decltype(os << x, void());

print_if_possible如果os << x,将只参与过载决议是一个格式正确的表达式。

live example on godbolt.org


我需要在 C++03 中做同样的事情,我发现 sizeof可以提供帮助(因为我需要一个未评估的表达式上下文)。这是我想出的:

template <int> struct sfinaer { };

template <typename T>
void print_if_possible(std::ostream& os, const T& x,
sfinaer<sizeof(os << x)>* = NULL);

live example on godbolt.org


似乎 g++clang++ 的最新版本都接受 sizeof带有 -std=c++03 -Wall -Wextra 的版本.

  • 是否保证代码在 C++03 中按预期工作?

  • 是否可以使用 sfinaer 将 C++11 表达式 SFINAE 的任何用法反向移植到 C++03?和 sizeof

最佳答案

表达 SFINAE 有点灰色。 C++03 基本上什么也没说。它既没有明确禁止也没有明确允许。当前的实现不允许这样的构造,因为它导致了相当大的实现复杂性,并且不清楚它是否意味着被允许,CWG 是 at one point倾向于在它最终被禁止之前禁止它(参见 2003 年 4 月的注释)reversed course ,部分是根据添加到 C++11 的 decltypeconstexpr(参见 N2634 的介绍)。

这一切都发生在 CWG 开始明确标记其决议旨在追溯应用的问题的 DR 状态之前。

我认为这里最好的建议就是“询问您的编译器供应商”。在 C++11 模式下支持表达式 SFINAE 的编译器不太可能在 C++03 模式下取消该支持(供应商可能将 CWG 339 视为缺陷报告并追溯应用,或将其视为扩展)。 OTOH,一个从不支持 C++11 的编译器不太可能投入大量必要的成本来让表达式 SFINAE 工作(事实上,它直到最近才在某个主要编译器中工作咳嗽)。我还怀疑仍然使用 15 年历史的语言的地方不太可能使用此类支持所需的现代工具链。

关于c++ - 这是在 C++03 中执行 "Expression SFINAE"的有效方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52514893/

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