从 if constexpr 块传递的地址总是保证在“上下文”之外有效吗?

问题描述 投票:0回答:1

给出这段代码:

#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
是有效的,因为使用 {} 创建的“上下文”只是用于指示应执行代码的哪些部分,而不创建实际的上下文。从大会上看来,也没有留下这样一个单独的背景。这是正确的还是我遗漏了什么?

c++ constexpr
1个回答
0
投票

if constexpr
没有特殊的大小写,这使得它“不创建实际的上下文”。 constexpr if 的受控语句是一个 compound-statement。任何复合语句都会创建块作用域。

复合语句定义块作用域

您的变量

t
是在块作用域内引入的,并且在控制流退出复合语句后不存在。

© www.soinside.com 2019 - 2024. All rights reserved.