相关疑难解决方法(0)

constexpr头文件中的全局常量和odr

不幸的是,我有点困惑constexpr,在头文件中声明的全局常量和odr.

简而言之:我们可以从这里结束

https://isocpp.org/files/papers/n4147.pdf

constexpr MyClass const MyClassObj () { return MyClass {}; }
constexpr char const * Hello () { return "Hello"; }
Run Code Online (Sandbox Code Playgroud)

比...好

constexpr MyClass const kMyClassObj = MyClass {};
constexpr char const * kHello = "Hello";
Run Code Online (Sandbox Code Playgroud)

如果我想"只使用"那些全局声明/定义的实体并且不想考虑我如何使用它们,那么在头文件中定义全局变量?

c++ linkage language-lawyer constexpr c++11

19
推荐指数
1
解决办法
7252
查看次数

C++标准:命名空间范围的constexpr变量是否具有内部链接?

想象一下,我们有一个foo.h包含以下内容的标题:

#ifndef FOO_H_
#define FOO_H_

namespace foo {
constexpr std::string_view kSomeString = "blah";
}

#endif  // FOO_H_
Run Code Online (Sandbox Code Playgroud)

foo::kSomeString保证在任何翻译单元,包括内部联动foo.h?这在C++ 11和C++ 17之间有所不同吗?

在草案标准[basic.link]/3中

具有命名空间作用域的名称具有内部链接,如果它是非易失性const限定类型的非内联变量的名称,该变量既未显式声明为extern,也未声明为具有外部链接[...]

但我不知道是否constexpr算作"const-qualified".标准是否在某处说出来?

假设这保证具有内部链接,看起来ODR对此用法没有问题,对吧?(与此答案中的内容形成鲜明对比.)

c++ linkage language-lawyer c++11 c++17

15
推荐指数
1
解决办法
1514
查看次数

返回从字符串文字创建的静态 string_view 是否安全?

我有一个相对简单的用例:我想将一个特征关联到一个类,该类将返回一些用户定义的字符串,即一些用户定义的注册 ID。由于这个注册应该在编译时定义,我希望它是 constexpr,所以我写了如下内容:

template <typename T>
struct ClassRegistration
{
    static constexpr std::string_view
    Name();
};

template <>                                                                                    
struct ClassRegistration<int>                                                            
{                                                                                              
    static constexpr std::string_view                                                        
    Name()                                                                                     
    {                                                                                          
        return std::string_view{ "int" };                                                     
    }                                                                                          
};
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/5p8xkA

一切正常,但由于 string_view 实际上并不拥有它的缓冲区,我想知道它是否保证安全,我不只是指一个悬空指针。从我读到的字符串文字保证具有与程序本身一样长的生命周期(从这个函数返回的字符串文字的SO Lifetime)。

因此,string_view 的这种用法是否安全合适?

c++ string-literals constexpr string-view c++17

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