给出这段代码:
#include <iostream>
#include <type_traits>
template <typename T>
void bar(T* t_ptr=nullptr){
if constexpr(!std::is_same<T, void>()){
std::cout << *t_ptr << "\n";
} else {
std::cout << "Ptr is null" << "\n";
}
}
template<typename T>
void foo(){
T* t_ptr = nullptr;
if constexpr(!std::is_same<T, void>()){
T t{42};
t_ptr = &t;
}
bar(t_ptr);
}
int main(){
foo<int>();
foo<double>();
foo<void>();
}
另请参阅此处https://godbolt.org/z/bEof7Pc4v
据我了解,将指针传递给
bar
是有效的,因为使用 {} 创建的“上下文”只是用于指示应执行代码的哪些部分,而不创建实际的上下文。从大会上看来,也没有留下这样一个单独的背景。这是正确的还是我遗漏了什么?
if constexpr
没有特殊的大小写,这使得它“不创建实际的上下文”。 constexpr if 的受控语句是一个 compound-statement。任何复合语句都会创建块作用域。
复合语句定义块作用域
您的变量
t
是在块作用域内引入的,并且在控制流退出复合语句后不存在。