Tôi có đoạn mã sau:constexpr của thành viên lớp tuple tĩnh có mối liên kết lỗi
#include <iostream>
#include <tuple>
class T
{
public:
using Names = std::tuple<char const*, char const*>;
static constexpr Names names {"First", "Second"};
};
int main()
{
std::cout << std::get<0>(T::names);
}
Như names
là một constexpr
tôi mong đợi này để làm việc. Nhưng tôi nhận được một lỗi mối liên kết:
Trình biên dịch:
> g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
Lỗi:
> g++ -std=c++1y pl.cpp
Undefined symbols for architecture x86_64:
"T::names", referenced from:
_main in pl-377031.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Tôi giả định rằng 'constexpr T :: Tên T :: tên;' phải đi trong đơn vị biên dịch và không thể nằm trong tệp tiêu đề được bao gồm nhiều lần. –
@CrappyExperienceBye Đúng - IIRC 'T :: names' có liên kết bên ngoài. – Columbo
Tôi có một thời gian khó hiểu việc sử dụng odr vì thuật ngữ liên quan: Tôi đã đọc về các biểu thức có khả năng đánh giá, chuyển đổi từ rvalue sang rvalue, và các kết quả tiềm năng trong Standard và cppreference nhưng nó khó hiểu. Có một nguồn toàn diện giải thích về sử dụng tiếng Anh không? –