yohhoyの日記

技術的メモをしていきたい日記

2017-01-01から1年間の記事一覧

Javaバージョン番号のひみつ

プログラミング言語Javaのバージョン番号付与ルールについてメモ。Java 1.0〜1.4までと、Java (SE) 5〜9ではバージョン番号の付与ルールが異なる。Java 5以降は一般に product version で呼称されるが、内部的には 1.N.0 のような developer version が付与…

参照型変数とメモリの関係

プログラミング言語C++の言語仕様では、メモリ空間上に 参照型(reference type) の実体が存在するか否かを規定しない(unspecified)。 スカラ型(scalar type)=算術型/列挙型/ポインタ型やその配列型などのオブジェクト(object)は、メモリ空間上に実体が配…

C++ Synchronized Buffered Ostream

C++2a(C++20)に向けて(PDF)P0053R6が採択され、マルチスレッド環境下でのストリーム出力排他制御をサポートする同期化出力ストリームstd::osyncstreamが追加される。 // C++2a(C++20) #include <syncstream> #include <iostream> void thread1(int value) { // 下記行の処理結果が</iostream></syncstream>…

dataメンバ関数:std::string vs. std::string_view

C++1z(C++17)標準ライブラリ文字列std::stringと文字列ビューstd::string_viewにおいて、dataメンバ関数が返すメモリ領域とヌル終端文字列の関係についてメモ。まとめ: stringに “非const版”dataメンバ関数 が追加され、変更可能なヌル終端文字列を返す。(…

文字列リテラルとヌル終端文字列とで関数オーバーロード

C++

プログラミング言語C++の文字列リテラル/ヌル終端文字列に対して、配列参照型をとる関数テンプレートf(const char(&)[N])とポインタ型をとる関数f(const char*)のオーバーロードは、プログラマの期待通りには振る舞わない。本記事の内容はStack Overflowで…

文字列リテラルからのstd::string_view構築

C++1z(C++17)において文字列リテラルから文字列ビューstd::string_viewへ変換する場合、暗黙の型変換ではなくユーザ定義リテラル""svの明示利用が望ましい。 string_viewクラスはC文字列(const char*)からの非explicit変換コンストラクタを提供する。 string…

std::string_viewでは値渡しを利用する

C++1z(C++17)標準ライブラリ提供のstd::string_view*1 を関数パラメータ型で利用する場合、原則として値渡し(pass-by-value)スタイルとすること。C++14以前でconst string&としていた関数パラメータ型は、ほとんどのケースでstring_viewへと単純置換できる。…

真偽値を返すメタ関数利用上の注意

C++標準ライブラリ <type_traits> ヘッダ提供の真偽値を返すメタ関数において、is_xxx<T>{}のような真偽値変換(→id:yohhoy:20121207)は適切でないケースがある。素直にis_xxx<T>::valueで真偽値を取り出すか、C++1z(C++17)で追加される変数テンプレート版メタ関数is_xxx_v<T>の利</t></t></t></type_traits>…

conjunction/disjunctionと短絡インスタンス化

C++1z(C++17)標準ライブラリで追加されるstd::conjunction, std::disjunctionメタ関数では、型特性(type traits)のテンプレートインスタンス化が短絡評価(short-circuiting)される。&&演算子, ||演算子では左辺の真偽値によらず全項のインスタンス化が行われ…

default指定でdeletedされるムーブ操作とオーバーロード解決

プログラミング言語C++において、“default指定でdeletedされるムーブコンストラクタ/代入演算子(→id:yohhoy:20130203)” はオーバーロード解決に影響しない。これはCWG DR 1402で修正された挙動。 struct X { const int i = 42; // constデータメンバを含…

シーケンスコンテナ×イテレータ・ペア×リスト初期化×推論ガイド=?

C++1z(C++17)標準ライブラリのシーケンスコンテナ(std::vectorなど)にはクラステンプレート引数推論 推論ガイド(deduction guide) が追加されたが、イテレータ・ペアによるリスト初期化(list initialization)では意図しない型推論が行われる。かなり罠っぽい…

C++ Concepts(P0734R0)

次期C++2a(C++20)標準規格に向けて採択された コンセプト(concept) についてメモ。*1本記事の内容は(PDF)P0734R0 Wording Paper, C++ extensions for Conceptsに基づく。要約: 新しいキーワード:concept, requires 新しい構文:コンセプト定義, requires式…

Underscore As A Keyword

Java 9では1文字アンダースコア(_)はキーワード(keyword)に変更され、変数名などに利用するとコンパイルエラーになる。Java 8以前は非推奨の識別子(identifier)であり、コンパイル時の警告メッセージにとどまっていた。 class UAAK { public static void mai…

Designated Initialization @ C++

C++2a(C++20)で導入予定のDesignated Initialization(指示付きの初期化)ついてメモ。C99での同一言語機能をベースとするが、一部機能制限された形でC++に導入される。 // C++2a(C++20) struct Point { int x, y; }; void f(Point); f({ .x = 100, .y = 50 …

std::launder関数

C++1z(C++17)標準ライブラリに追加されるstd::launder関数テンプレートについて。メモリ・ロンダリング関数。*1まとめ: オブジェクト生存期間(lifetime)に基づいた最適化の抑止をコンパイラに伝える関数。プログラマ視点では “何もしない関数” にみえる。*2…

関数テンプレートでの可変長引数テンプレート明示特殊化の複雑な関係

C++

プログラミング言語C++において、可変長引数テンプレートのテンプレート・パラメータパック(template parameter pack)は、関数テンプレートに対する明示的なテンプレート実引数指定では完全に特殊化できない(パターンがある)。本記事の内容はStack Overflo…

fallthrough属性利用時のちょっとした注意点

C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…

std::stringとリスト初期化の小さな罠

C++

C++標準ライブラリの文字列型std::stringと、リスト初期化(list initialization)の組み合わせによる落とし穴。2個の文字列リテラルによるstd::stringのリスト初期化は、ほとんどのC++処理系においてコンパイル時には問題検知されないが*1、実行時に未定義動…

条件演算子と親クラスへの型推論(Java編)

プログラミング言語Javaにおける条件演算子(conditional operator) ?: と、子クラスから親クラスへの型推論(の一部)に関してメモ。条件演算子の第2, 3項目に親クラスParentから派生した子クラスChild1, Child2を指定した場合、Javaでは部分式 (b ? c1 : c2…

条件演算子と親クラスへの型推論(C++編)

C++

プログラミング言語C++における条件演算子(conditional operator) ?: と、子クラスから親クラスへの型推論に関してメモ。条件演算子の第2, 3項目に親クラスParentから派生した子クラスChild1, Child2を指定した場合、C++では型推論に失敗してコンパイルエラ…

条件演算子と親クラスへの型推論(C#編)

C#

プログラミング言語C#における条件演算子(conditional operator) ?: と、子クラスから親クラスへの型推論に関してメモ。条件演算子の第2, 3項目に親クラスParentから派生した子クラスChild1, Child2を指定した場合、C#では型推論に失敗してコンパイルエラー…

std::byte型あれこれ

C++1z(C++17)で導入されるstd::byte型に関するメモ。コンパイル時型検査による安全性向上を目的として、「バイト(byte)」を表す標準データ型として導入される。C++標準ライブラリの拡張だけではなく、C++言語仕様にも特別扱いが追加される。 // 標準ヘッダ<cstddef> n</cstddef>…

signatureの定義

C++

プログラミング言語C++における関数シグネチャ(signature)の定義についてメモ。 2021-09-27追記:C++20以降の関数シグネチャ定義は signatureの定義 @ C++20 を参照のこと。まとめ: 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外) 関数テン…

C標準ヘッダ in 未来のC++

プログラミング言語C++標準規格におけるC標準ヘッダ(<stdlib.h> や <stdio.h> など)の扱いについて。2021-10-27追記:C++2b(C++23)に向けた提案 P2340R1 が採択され、全てのC標準ヘッダについて廃止予定が取り止められた。例えば<iso646.h>ヘッダは空っぽ、<complex.h>ヘッダは#include <complex>と規定され</complex></complex.h></iso646.h></stdio.h></stdlib.h>…

初期化子リスト要素数不足時の初期値

C

プログラミング言語Cにおいて、構造体/配列型変数宣言の初期化子リスト(initializer-list)*1で要素数が足りない場合の初期値について。 ポインタ型の場合、ヌルポインタ(NULL) で初期化される。*2 算術型の場合、(正値または符号無し)値0 で初期化される…

ポインタ型への非NULLアノテーションもどき

C99仕様で拡張された構文を用いて、関数引数としてのポインタ型に非NULLアノテーションを行う方法。正直微妙。 int f1(int *p) { if (p == NULL) return 42; return *p; } int f2(int p[static 1]) { if (p == NULL) return 42; return *p; } Clang 3.5/-O1…

不動点コンビネータ with XSLT 3.0

XSL Transformations(XSLT) 3.0にて関数型がファーストクラスになり、高階関数(higher-order function)がサポートされた。W3C XSLT 3.0勧告, §1.2より該当箇所を引用: XSLT 3.0 also delivers enhancements made to the XPath language and to the standard…

危険な型変換:&T→&mut T

プログラミング言語Rustにおける、&Tから&mut Tへの型変換*1と同オブジェクトに対する変更操作は、未定義動作(undefined behavior)とされている。これは単にRustコンパイラのBorrow Checkerを騙すだけでなく、該当プログラムの動作が不定となり深刻な障害要…

IntelliSenseコンテキスト判別マクロ

Visual Studio 2010以降では、IntelliSenseコンテキスト判別用マクロ__INTELLISENSE__が定義される。 #ifdef __INTELLISENSE__ ... #endif MSDN公式ドキュメントにはVisual Studio 2015以降から記載されている。関連URL Troubleshooting Tips for IntelliSen…

Objective-C atomic属性プロパティとスレッド間同期

LLVM/Objective-Cのatomic属性プロパティが保証する性質、C言語(C11)のAtomic変数アクセスとの比較、およびマルチスレッド処理での利用についてメモ。超要約:Objective-C @property宣言には常にnonatomic属性を指定せよ。atomic属性プロパティは人類には早…