相关疑难解决方法(0)

铸造到'void'真的有什么作用?

经常使用的语句(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;.

哪一项更正确?如果没有,那么如何解释编译器警告的差异?

c++ casting void compiler-warnings suppress-warnings

29
推荐指数
3
解决办法
1万
查看次数

难以理解基于 SFINAE 的特征的通用 lambda 语法

我正在阅读一些基于 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)

c++ sfinae type-traits c++17

5
推荐指数
1
解决办法
153
查看次数