one-definition-rule

    1熱度

    1回答

    我知道,有很多關於靜態(constexpr)成員鏈接的回答問題。 但我想知道,爲什麼在頭文件中使用模板類線外定義,但不適用於專門的類。 a)本工程不鏈接錯誤: template<typename, typename> struct Foobar; template<typename T> struct Foobar<int, T> { static constexpr std::

    3熱度

    2回答

    我有這樣的代碼: #include <iostream> struct A { template<typename T> bool isImplemented() { std::cout << "Not Implemented" << std::endl; return false; } }; template<> inli

    8熱度

    2回答

    DR 712負責將C++ 11中[basic.def.odr]/2的措辭改爲當前的措辭,[basic.def.odr]2 and 3。但我還是想知道,對於變更的原因,如DR聲明,內容如下:「?用」 712是一個條件表達式的整數常數操作 在描述類 定義內部初始化的靜態數據成員,9.2.3.2 [class.static.data]段落3表示, 人員應仍然在命名空間範圍來限定,如果它是在程序中使用 .

    5熱度

    1回答

    這基本上是有關DR 712的my prior question的延續。讓我先解釋一下爲什麼我堅持要看一些可能被認爲是舊的東西,如C++ 11標準,但我的問題是[C++ 11]中的[basic.def.odr]這部分已經很難理解了,在我深入研究當前草案中的同一部分之前,我想完整地介紹這一部分,在我看來,更加複雜。 對我之前問題Austing Hasting的回答很好,但我仍然有一點在C++ 11的[

    2熱度

    2回答

    假設我有一個名爲libplugin的共享庫。在此共享庫中,有一類: class Plugin { public: virtual void doStuff(); }; 讓我們也假設有一個名爲libspecialplugin另一個共享庫。它包含以下類和函數: class SpecialPlugin : public Plugin { public:

    5熱度

    1回答

    違反ODR在從生產線上圖書館閱讀代碼,我發現這樣的事情 Traits.hpp template <typename Type> class Traits { template <typename T, detail::EnableIfIsInstantiation<T, Type>* = nullptr> static void foo(T& object)

    4熱度

    2回答

    前提 根據一個定義規則,如在C++14 Standard所述,我可以在只要每個轉換單元一個同一個類的定義因爲我遵循3.2.6中的規則。這意味着允許下面的程序是合法的: //a_1.cpp class A { //definition of A int a; //definition of A::a static int b; //declaratio

    3熱度

    4回答

    在使用C和C++的項目中,.h文件包含一個類型的定義。如果該定義取決於頭文件是否包含在c或cpp文件中,我違反了一個定義規則嗎? // my_header.h struct MyStruct { #ifdef __cplusplus std::size_t member; int surprise; #else unsigned member; #endif

    2熱度

    1回答

    看到another question我意識到我不能通過頭文件從匿名名稱空間使用對象或函數,因爲它會在類定義或內聯函數中導致ODR違例。如果是這種情況,那麼是否可以在inline函數或類中安全使用名爲const或constexprstatic的對象?例如,如果CONSTANT在namespace以內,它將是不安全的,但是使用靜態鏈接的常量是否可以? // some header file to be

    2熱度

    1回答

    我想定義一些字符串文字和一些常量結構。 做了一些測試,我意識到,使用: constexpr char* name = "name"; constexpr Structure data = {1, 2, 3}; 當編譯不同的庫我要創建的名稱和數據的存儲地址是每個庫不同。 這我真的不想發生。 我做了另外一個測試: constexpr char* name() { return "name"; }