经常使用的语句(void)x;允许禁止有关未使用变量的警告x.但是如果我尝试编译以下内容,我会得到一些我不太了解的结果:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译它,我得到以下警告:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Run Code Online (Sandbox Code Playgroud)
因此,我得出结论,转换为void与任何其他类型的转换非常不同,是目标类型相同decltype(x)或不同的东西.我猜测可能的解释是:
(void)x;但其他演员不会抑制警告.所有陈述同样没有任何效果.void x;并非如此short x;.哪一项更正确?如果没有,那么如何解释编译器警告的差异?
我正在阅读一些基于 SFINAE 的特征的示例,但无法理解与 C++17 中的通用 lambda 相关的示例(isvalid.hpp)。
我可以理解它大致包含一些主要部分,以便实现类型特征,例如isDefaultConstructibleorhasFirst特征(isvalid1.cpp):
1. 使用 SFINAE 技术的辅助函数:
#include <type_traits>
// helper: checking validity of f(args...) for F f and Args... args:
template<typename F, typename... Args,
typename = decltype(std::declval<F>()(std::declval<Args&&>()...))>
std::true_type isValidImpl(void*);
// fallback if helper SFINAE'd out:
template<typename F, typename... Args>
std::false_type isValidImpl(...);
Run Code Online (Sandbox Code Playgroud)
2. 确定有效性的通用 lambda:
// define a lambda that takes a lambda f and returns whether calling f with args is valid
inline constexpr …Run Code Online (Sandbox Code Playgroud)